package com.chaoyong.higo.bean;

import java.util.List;

/**
 * Created by Administrator on 2016/3/15.
 */
public class DaoJSBean {

    /**
     * message : 成功
     * status : 1
     * data : {"page":"","list":[{"goods_id":"8","expect":"58","goods_status":"1","open_time":"1458040085","id":"8","goods_name":"MySQL技术内幕：InnoDB存储引擎（第2版）","goods_expect":"国内外数据库专家联袂推荐，基于MySQL 5.6，从存储引擎内核角度对InnoDB的核心实现和工作机制进行深入剖析","cover_img":["o_1a94u9g85u13o66mlje6jf3qd.jpg","o_1a94u9g85q5a1chn70b2b3ccve.jpg","o_1a94u9g85ltf4ug1us01skl56sf.jpg","o_1a94u9g86bpsa722q11evbh33g.jpg"],"goods_info":"<div id=\"detail-tag-id-2\" name=\"detail-tag-id-2\" text=\"编辑推荐\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|bianjituijianqu_3\"><div class=\"item-mt\"><h3>编辑推荐<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　畅销书全新升级，第1版广获好评；资深MySQL专家撰写，全球知名MySQL数据库服务提供商Percona公司CTO作序推荐，国内多位数据库专家联袂推荐<br/>　　基于MySQL 5.6，结合源代码，从存储引擎内核角度对InnoDB的整体架构、核心实现和工作机制进行深入剖析<\/p><p><br/><\/p><p><strong><span style=\"font-size: 12px;color: rgb(102, 102, 102)\">更多精彩，点击进入品牌店查阅&gt;&gt;<\/span><\/strong><\/p><p><a href=\"http://mall.jd.com/view_page-27025526.html\" target=\"_blank\"><img class=\"\" src=\"//img30.360buyimg.com/vc/jfs/t2026/38/1749253666/89958/8f2dcc57/56724e61N00307fa1.jpg\" style=\"\" data-lazyload=\"done\" title=\"750-110.jpg\"/><\/a><\/p><\/div><\/div><\/div><div id=\"detail-tag-id-3\" name=\"detail-tag-id-3\" text=\"内容简介\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|neirongjianjiequ_3\"><div class=\"item-mt\"><h3>内容简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\">　　《MySQL技术内幕：InnoDB存储引擎》由国内资深MySQL专家亲自执笔，国内外多位数据库专家联袂推荐。作为国内一本关于InnoDB的专著，本书的第1版广受好评，第2版不仅针对全新的MySQL 5.6对相关内容进行了全面的补充，还根据广大读者的反馈意见对第1版中存在的不足进行了完善，全书大约重写了50％的内容。本书从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制，并给出了大量实践，能帮助你系统而深入地掌握InnoDB，更重要的是，它能为你设计管理高性能、高可用的数据库系统提供专业的指导。<br/>　　《MySQL技术内幕：InnoDB存储引擎》一共10章，首先宏观地介绍了MySQL的体系结构和各种常见的存储引擎以及它们之间的比较；接着以InnoDB的内部实现为切入点，逐一详细讲解了InnoDB存储引擎内部的各个功能模块的实现原理，包括InnoDB存储引擎的体系结构、内存中的数据结构、基于InnoDB存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份与恢复，以及InnoDB的性能调优等重要的知识；最后对InnoDB存储引擎源代码的编译和调试做了介绍，对大家阅读和理解InnoDB的源代码有重要的指导意义。<br/>　　本书适合所有希望构建和管理高性能、高可用性的MySQL数据库系统的开发者和DBA阅读。<br/><\/div><\/div><\/div><div id=\"detail-tag-id-4\" name=\"detail-tag-id-4\" text=\"作者简介\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|zuozhejianjiequ_3\"><div class=\"item-mt\"><h3>作者简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　姜承尧（David Jiang），资深MySQL数据库专家，擅长于数据库的故障诊断、性能调优、容灾处理、高可用和高扩展研究，同时一直致力于MySQL数据库底层实现原理的研究和探索。此外，对高性能数据库和数据仓库也有深刻而独到的理解。曾为MySQL编写了许多开源工具和性能扩展补丁，如广受好评的InnoDB引擎二级缓存项目。现任网易杭州研究院技术经理一职，负责MySQL数据库的内核开发，参与设计与开发MySQL数据库在网易云环境中的应用。曾担任久游网数据库工程部经理，曾领导并参与了多个大型核心数据库的设计、实施、管理和维护，实战经验非常丰富。活跃于开源数据库以及开源软件领域，是著名开源社区ChinaUnix MySQL版块的版主，热衷于与网友分享自己的心得和体会，深受社区欢迎。<br/>　　除本书外，他还撰写了《MySQL技术内幕：SQL编程》，是本书的姊妹篇，颇受好评。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-6\" name=\"detail-tag-id-6\" text=\"目录\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|muluqu_3\"><div class=\"item-mt\"><h3>目录<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\">推荐序<br/>前言<br/>第1章　MySQL体系结构和存储引擎<br/>1.1　定义数据库和实例<br/>1.2　MySQL体系结构<br/>1.3　MySQL存储引擎<br/>1.3.1　InnoDB存储引擎<br/>1.3.2　MyISAM存储引擎<br/>1.3.3　NDB存储引擎<br/>1.3.4　Memory存储引擎<br/>1.3.5　Archive存储引擎<br/>1.3.6　Federated存储引擎<br/>1.3.7　Maria存储引擎<br/>1.3.8　其他存储引擎<br/>1.4　各存储引擎之间的比较<br/>1.5　连接MySQL<br/>1.5.1　TCP/IP<br/>1.5.2　命名管道和共享内存<br/>1.5.3　UNIX域套接字<br/>1.6　小结<br/>第2章　InnoDB存储引擎<br/>2.1　InnoDB存储引擎概述<br/>2.2　InnoDB存储引擎的版本<br/>2.3　InnoDB体系架构<br/>2.3.1　后台线程<br/>2.3.2　内存<br/>2.4　Checkpoint技术<br/>2.5　Master Thread工作方式<br/>2.5.1　InnoDB 1.0.x版本之前的Master Thread<br/>2.5.2　InnoDB1.2.x版本之前的Master Thread<br/>2.5.3　InnoDB1.2.x版本的Master Thread<br/>2.6　InnoDB关键特性<br/>2.6.1　插入缓冲<br/>2.6.2　两次写<br/>2.6.3　自适应哈希索引<br/>2.6.4　异步IO<br/>2.6.5　刷新邻接页<br/>2.7　启动、关闭与恢复<br/>2.8　小结<br/>第3章　文件<br/>3.1　参数文件<br/>3.1.1　什么是参数<br/>3.1.2　参数类型<br/>3.2　日志文件<br/>3.2.1　错误日志<br/>3.2.2　慢查询日志<br/>3.2.3　查询日志<br/>3.2.4　二进制日志<br/>3.3　套接字文件<br/>3.4　pid文件<br/>3.5　表结构定义文件<br/>3.6　InnoDB存储引擎文件<br/>3.6.1　表空间文件<br/>3.6.2　重做日志文件<br/>3.7　小结<br/>第4章　表<br/>4.1　索引组织表<br/>4.2　InnoDB逻辑存储结构<br/>4.2.1　表空间<br/>4.2.2　段<br/>4.2.3　区<br/>4.2.4　页<br/>4.2.5　行<br/>4.3　InnoDB行记录格式<br/>4.3.1　Compact行记录格式<br/>4.3.2　Redundant行记录格式<br/>4.3.3　行溢出数据<br/>4.3.4　Compressed和Dynamic行记录格式<br/>4.3.5　CHAR的行结构存储<br/>4.4　InnoDB数据页结构<br/>4.4.1　File Header<br/>4.4.2　Page Header<br/>4.4.3　Infimum和Supremum Records<br/>4.4.4　User Records和Free Space<br/>4.4.5　Page Directory<br/>4.4.6　File Trailer<br/>4.4.7　InnoDB数据页结构示例分析<br/>4.5　Named File Formats机制<br/>4.6　约束<br/>4.6.1　数据完整性<br/>4.6.2　约束的创建和查找<br/>4.6.3　约束和索引的区别<br/>4.6.4　对错误数据的约束<br/>4.6.5　ENUM和SET约束<br/>4.6.6　触发器与约束<br/>4.6.7　外键约束<br/>4.7　视图<br/>4.7.1　视图的作用<br/>4.7.2　物化视图<br/>4.8　分区表<br/>4.8.1　分区概述<br/>4.8.2　分区类型<br/>4.8.3　子分区<br/>4.8.4　分区中的NULL值<br/>4.8.5　分区和性能<br/>4.8.6　在表和分区间交换数据<br/>4.9　小结<br/>第5章　索引与算法<br/>5.1　InnoDB存储引擎索引概述<br/>5.2　数据结构与算法<br/>5.2.1　二分查找法<br/>5.2.2　二叉查找树和平衡二叉树<br/>5.3　B+树<br/>5.3.1　B+树的插入操作<br/>5.3.2　B+树的删除操作<br/>5.4　B+树索引<br/>5.4.1　聚集索引<br/>5.4.2　辅助索引<br/>5.4.3　B+树索引的分裂<br/>5.4.4　B+树索引的管理<br/>5.5　Cardinality值<br/>5.5.1　什么是Cardinality<br/>5.5.2　InnoDB存储引擎的Cardinality统计<br/>5.6　B+树索引的使用<br/>5.6.1　不同应用中B+树索引的使用<br/>5.6.2　联合索引<br/>5.6.3　覆盖索引<br/>5.6.4　优化器选择不使用索引的情况<br/>5.6.5　索引提示<br/>5.6.6　Multi-Range Read优化<br/>5.6.7　Index Condition Pushdown（ICP）优化<br/>5.7　哈希算法<br/>5.7.1　哈希表<br/>5.7.2　InnoDB存储引擎中的哈希算法<br/>5.7.3　自适应哈希索引<br/>5.8　全文检索<br/>5.8.1　概述<br/>5.8.2　倒排索引<br/>5.8.3　InnoDB全文检索<br/>5.8.4　全文检索<br/>5.9　小结<br/>第6章　锁<br/>6.1　什么是锁<br/>6.2　lock与latch<br/>6.3　InnoDB存储引擎中的锁<br/>6.3.1　锁的类型<br/>6.3.2　一致性非锁定读<br/>6.3.3　一致性锁定读<br/>6.3.4　自增长与锁<br/>6.3.5　外键和锁<br/>6.4　锁的算法<br/>6.4.1　行锁的3种算法<br/>6.4.2　解决Phantom Problem<br/>6.5　锁问题<br/>6.5.1　脏读<br/>6.5.2　不可重复读<br/>6.5.3　丢失更新<br/>6.6　阻塞<br/>6.7　死锁<br/>6.7.1　死锁的概念<br/>6.7.2　死锁概率<br/>6.7.3　死锁的示例<br/>6.8　锁升级<br/>6.9　小结<br/>第7章　事务<br/>7.1　认识事务<br/>7.1.1　概述<br/>7.1.2　分类<br/>7.2　事务的实现<br/>7.2.1　redo<br/>7.2.2　undo<br/>7.2.3　purge<br/>7.2.4　group commit<br/>7.3　事务控制语句<br/>7.4　隐式提交的SQL语句<br/>7.5　对于事务操作的统计<br/>7.6　事务的隔离级别<br/>7.7　分布式事务<br/>7.7.1　MySQL数据库分布式事务<br/>7.7.2　内部XA事务<br/>7.8　不好的事务习惯<br/>7.8.1　在循环中提交<br/>7.8.2　使用自动提交<br/>7.8.3　使用自动回滚<br/>7.9　长事务<br/>7.10　小结<br/>第8章　备份与恢复<br/>8.1　备份与恢复概述<br/>8.2　冷备<br/>8.3　逻辑备份<br/>8.3.1　mysqldump<br/>8.3.2　SELECT...INTO OUTFILE<br/>8.3.3　逻辑备份的恢复<br/>8.3.4　LOAD DATA INFILE<br/>8.3.5　mysqlimport<br/>8.4　二进制日志备份与恢复<br/>8.5　热备<br/>8.5.1　ibbackup<br/>8.5.2　XtraBackup<br/>8.5.3　XtraBackup实现增量备份<br/>8.6　快照备份<br/>8.7　复制<br/>8.7.1　复制的工作原理<br/>8.7.2　快照+复制的备份架构<br/>8.8　小结<br/>第9章　性能调优<br/>9.1　选择合适的CPU<br/>9.2　内存的重要性<br/>9.3　硬盘对数据库性能的影响<br/>9.3.1　传统机械硬盘<br/>9.3.2　固态硬盘<br/>9.4　合理地设置RAID<br/>9.4.1　RAID类型<br/>9.4.2　RAID Write Back功能<br/>9.4.3　RAID配置工具<br/>9.5　操作系统的选择<br/>9.6　不同的文件系统对数据库性能的影响<br/>9.7　选择合适的基准测试工具<br/>9.7.1　sysbench<br/>9.7.2　mysql-tpcc<br/>9.8　小结<br/>第10章　InnoDB存储引擎源代码的编译和调试<br/>10.1　获取InnoDB存储引擎源代码<br/>10.2　InnoDB源代码结构<br/>10.3　MySQL 5.1版本编译和调试InnoDB源代码<br/>10.3.1　Windows下的调试<br/>10.3.2　Linux下的调试<br/>10.4　cmake方式编译和调试InnoDB存储引擎<br/>10.5　小结<\/div><\/div><div class=\"more\"><a data-open=\"1\" href=\"http://#detail-tag-id-6\" clstag=\"shangpin|keycount|product|muluquanbu_3\">收起全部↑<\/a><\/div><\/div><div id=\"detail-tag-id-8\" name=\"detail-tag-id-8\" text=\"前言/序言\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|qianyanqu_3\"><div class=\"item-mt\"><h3>前言/序言<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\">　　为什么要写这本书<br/>　　过去这些年我一直在和各种不同的数据库打交道，见证了MySQL从一个小型的关系型数据库发展为各大企业的核心数据库系统的过程，并且参与了一些大大小小的项目的开发工作，成功地帮助开发人员构建了可靠的、健壮的应用程序。在这个过程中积累了一些经验，正是这些不断累积的经验赋予了我灵感，于是有了这本书。这本书实际上反映了这些年来我做了哪些事情，其中汇集了很多同行每天可能都会遇到的一些问题，并给出了解决方案。<br/>　　MySQL数据库独有的插件式存储引擎架构使其和其他任何数据库都不同。不同的存储引擎有着完全不同的功能，而InnoDB存储引擎的存在使得MySQL跃入了企业级数据库领域。本书完整地讲解了InnoDB存储引擎中最重要的一些内容，即InnoDB的体系结构和工作原理，并结合InnoDB的源代码讲解了它的内部实现机制。<br/>　　本书不仅讲述了InnoDB存储引擎的诸多功能和特性，还阐述了如何正确地使用这些功能和特性，更重要的是，还尝试了教我们如何Think Different。Think Different是20世纪90年代苹果公司在其旷日持久的宣传活动中提出的一个口号，借此来重振公司的品牌，更重要的是，这个口号改变了人们对技术在日常生活中的作用的看法。需要注意的是，苹果的口号不是Think Differently，是Think Different，Different在这里做名词，意味该思考些什么。<br/>　　很多DBA和开发人员都相信某些\u201c神话\u201d，然而这些\u201c神话\u201d往往都是错误的。无论计算机技术发展的速度变得多快，数据库的使用变得多么简单，任何时候Why都比What重要。只有真正理解了内部实现原理、体系结构，才能更好地去使用。这正是人类正确思考问题的原则。因此，对于当前出现的技术，尽管学习其应用很重要，但更重要的是，应当正确地理解和使用这些技术。<br/>　　关于本书，我的头脑里有很多个目标，但最重要的是想告诉大家如下几个简单的观点：<br/>　　·不要相信任何的\u201c神话\u201d，学会自己思考；<br/>　　·不要墨守成规，大部分人都知道的事情可能是错误的；<br/>　　·不要相信网上的传言，去测试，根据自己的实践做出决定；<br/>　　·花时间充分地思考，敢于提出质疑。<br/>　　当前有关MySQL的书籍大部分都集中在教读者如何使用MySQL，例如SQL语句的使用、复制的搭建的、数据的切分等。没错，这对快速掌握和使用MySQL数据库非常有好处，但是真正的数据库工作者需要了解的不仅仅是应用，更多的是内部的具体实现。<br/>　　MySQL数据库独有的插件式存储引擎使得想要在一本书内完整地讲解各个存储引擎变得十分困难，有的书可能偏重对MyISAM的介绍，有的可能偏重对InnoDB存储引擎的介绍。对于初级的DBA来说，这可能会使他们的理解变得更困难。对于大多数MySQL DBA和开发人员来说，他们往往更希望了解作为MySQL企业级数据库应用的第一存储引擎的InnoDB，我想在本书中，他们完全可以找到他们希望了解的内容。<br/>　　再强调一遍，任何时候Why都比What重要，本书从源代码的角度对InnoDB的存储引擎的整个体系架构的各个组成部分进行了系统的分析和讲解，剖析了InnoDB存储引擎的核心实现和工作机制，相信这在其他书中是很难找到的。<br/>　　第1版与第2版的区别<br/>　　本书是第2版，在写作中吸收了读者对上一版内容的许多意见和建议，同时对于最新MySQL 5.6中许多关于InnoDB存储引擎的部分进行了详细的解析与介绍。希望通过这些改进，给读者一个从应用到设计再到实现的完整理解，弥补上一版中深度有余，内容层次不够丰富、分析手法单一等诸多不足。<br/>　　较第1版而言，第2版的改动非常大，基本上重写了50%的内容。其主要体现在以下几个方面，希望读者能够在阅读中体会到。<br/>　　·本书增加了对最新MySQL 5.6中的InnoDB存储引擎特性的介绍。MySQL 5.6版本是有史以来最大的一次更新，InnoDB存储引擎更是添加了许多功能，如多线程清理线程、全文索引、在线索引添加、独立回滚段、非递归死锁检测、新的刷新算法、新的元数据表等。读者通过本书可以知道如何使用这些特性、新特性存在的局限性，并明白新功能与老版本InnoDB存储引擎之间实现的区别，从而在实际应用中充分利用这些特性。<br/>　　·根据读者的要求对于InnoDB存储引擎的redo日志和undo日志进行了详细的分析。读者应该能更好地理解InnoDB存储引擎事务的实现。在undo日志分析中，通过InnoSQL自带的元数据表，用户终于可对undo日志进行统计和分析，极大提高了DBA对于InnoDB存储引擎内部的认知。<br/>　　·对第6章进行大幅度的重写，读者可以更好地理解InnoDB存储引擎特有的next-key locking算法，并且通过分析锁的实现来了解死锁可能产生的情况，以及InnoDB存储引擎内部是如何来避免死锁问题的产生的。<br/>　　·根据读者的反馈，对InnoDB存储引擎的insert buffer模块实现进行了更为详细的介绍，读者可以了解其使用方法以及其内部的实现原理。此外还增加了对insert buffer的升级版本功能\u2014\u2014change buffer的介绍。<br/>　　读者对象<br/>　　本书不是一本面向应用的数据库类书籍，也不是一本参考手册，更不会教你如何在MySQL中使用SQL语句。本书面向那些使用MySQL InnoDB存储引擎作为数据库后端开发应用程序的开发者和有一定经验的MySQL DBA。书中的大部分例子都是用SQL语句来展示关键特性的，如果想通过本书来了解如何启动MySQL、如何配置Replication环境，可能并不能如愿。不过，在本书中，你将知道InnoDB存储引擎是如何工作的，它的关键特性的功能和作用是什么，以及如何正确配置和使用这些特性。<br/>　　如果你想更好地使用InnoDB存储引擎，如果你想让你的数据库应用获得更好的性能，就请阅读本书。从某种程度上讲，技术经理或总监也要非常了解数据库，要知道数据库对于企业的重要性。如果技术经理或总监想安排员工参加MySQL数据库技术方面的培训，完全可以利用本书来\u201c充电\u201d，相信你一定不会失望的。<br/>　　要想更好地学习本书的内容，要求具备以下条件：<br/>　　·掌握SQL。<br/>　　·掌握基本的MySQL操作。<br/>　　·接触过一些高级语言，如C、C++、Python或Java。<br/>　　·对一些基本算法有所了解，因为本书会分析InnoDB存储引擎的部分源代码，如果你能看懂这些算法，这会对你的理解非常有帮助。<br/>　　如何阅读本书<br/>　　本书一共有10章，每一章都像一本\u201c迷你书\u201d，可以单独成册，也就说你完全可以从书中任何一章开始阅读。例如，要了解第10章中的InnoDB源代码编译和调试的知识，就不必先去阅读第3章有关文件的知识。当然，如果你不太确定自己是否已经对本书所涉及的内容完全掌握了，建议你系统性地阅读本书。<br/>　　本书不是一本入门书籍，不会一步步引导你去如何操作。倘若你尚不了解InnoDB存储引擎，本书对你来说可能就显得沉重一些，建议你先查阅官方的API文档，大致掌握InnoDB的基础知识，然后再来学习本书，相信你会领略到不同的风景。<br/>　　为了便于大家阅读，本书在提供源代码下载的同时也将源代码附在了书中，因此占去了一些篇幅，还请大家理解。<br/>　　致谢<br/>　　在编写本书的过程中，我得到了很多朋友的热心帮助。首先要感谢Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko，通过和他们的不断交流，使我对InnoDB存储引擎有了更进一步的了解，同时知道了怎样才能正确地将InnoDB存储引擎的补丁应用到生产环境。<br/>　　其次，要感谢网易公司的各位同事们，能在才华横溢、充满创意的团队中工作我感到非常荣幸和兴奋。也因为在这个开放的工作环境中，我可以不断进行研究和创新。<br/>　　此外，我还要感谢我的母亲，写本书不是一件容易的事，特别是这本书还想传达一些思想，在这个过程中我遇到了很多的困难，感谢她在这个过程中给予我的支持和鼓励。<br/>　　最后，一份特别的感谢要送给本书的策划编辑杨福川和姜影，他们使得本书变得生动和更具有灵魂。此外还要感谢出版社的其他默默工作的同事们。<br/>　　姜承尧<\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-8\" clstag=\"shangpin|keycount|product|qianyanquanbu_3\">查看全部↓<\/a><\/div><\/div><p><br/><\/p>","goods_price":"100.00","type_id":"61","parent_id":"60","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94u9g85u13o66mlje6jf3qd.jpg","surplus":100},{"goods_id":"7","expect":"38","goods_status":"1","open_time":"1458040121","id":"7","goods_name":"PHP和MySQL Web开发（原书第4版）  [PHP a","goods_expect":"PHP和 MySQL Web 开发\u201c圣经\u201d 持续4版畅销","cover_img":["o_1a94phnab116hmid1i2hg5a16ttc.jpg","o_1a94phnabjbkf2ne171qmj1fucd.jpg","o_1a94phnab18cv1s7l1k5udfk1a9le.jpg"],"goods_info":"<div id=\"detail-tag-id-2\" name=\"detail-tag-id-2\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>编辑推荐<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p><span style=\"font-size:12px;\">　　PHP和MySQL Web开发\u201c圣经\u201d<br/>　　持续4版畅销<br/>　　PHP和MySQL是非常流行的开源技术，它们非常适合快速开发数据库驱动的Web应用。PHP是一种功能强大的脚本语言，专门用于快速创建高性能的Web应用，而MySQL则是一个快速而又可靠的数据库，它能很好地与PHP集成，适用于基于互联网的动态应用。<br/>　　本书介绍了如何使用这些工具创建高效和交互式的Web应用。它清晰地介绍了PHP语言的基础，解释了如何设置和使用MySQL数据，以及如何使用PHP与数据库和服务器进行交互。<br/>　　本书非常实用，包括大量实际应用中的例子。例如，用户验证、创建购物车、动态生成PDF文档和图像、发送和管理电子邮件、管理用户讨论、使用XML连接Web服务，以及使用基于Ajax的交互性开发Web 2.0应用。<br/>　　与上一版相比，本书经过了更新、重写以及扩展，并涵盖了PHP 5到5.3的所有特性，例如命名空间和闭包以及MySQL 5.1引入的特性。<\/span><strong><span style=\"font-size:12px;\"><br/><br/>更多精彩，点击进入品牌店查阅&gt;&gt;<br/><\/span><\/strong><\/p><p><a href=\"http://mall.jd.com/view_page-27025526.html\" target=\"_blank\"><img class=\"\" src=\"http://img30.360buyimg.com/vc/jfs/t1864/182/1049838360/89958/8f2dcc57/56678e7dN390a2c8c.jpg\" style=\"\" data-lazyload=\"done\" title=\"750-110.jpg\" alt=\"\"/><\/a><\/p><\/div><\/div><\/div><div id=\"detail-tag-id-3\" name=\"detail-tag-id-3\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>内容简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　《PHP和MySQL Web开发（原书第4版）》将PHP开发与MySQL应用相结合，分别对PHP和MySQL做了深入浅出的分析，不仅介绍PHP和MySQL的一般概念，而且对PHP和MySQL的Web应用做了较全面的阐述，并包括几个经典且实用的例子。<br/>　　《PHP和MySQL Web开发（原书第4版）》是第4版，经过了全面的更新、重写和扩展，包括PHP 5.3改进的特性（例如，更好的错误和异常处理），MySQL的存储过程和存储引擎，Ajax技术与Web 2.0以及Web应用需要注意的安全问题。<br/>　　PHP平IEIMySQL是非常流行的开源技术，它们非常适合快速开发数据库驱动的Web应用。PHP是一种功能强大的脚本语言，专门用于快速创建高性能的Web应用，而MySQL则是一个快速而又可靠的数据库，它能很好地与PHP集成，适用于基于互联网的动态应用。<br/>　　《PHP和MySQL Web开发（原书第4版）》介绍了如何使用这些工具创建高效和交互式的Web应用。它清晰地介绍了PHP语言的基础，解释了如何设置和使用MySQL数据，以及如何使用PHP与数据库和服务器进行交互。<br/>　　《PHP和MySQL Web开发（原书第4版）》非常实用，包括大量实际应用中的例子。例如，用户验证、创建购物车、动态生成PDF文档和图像、发送和管理电子邮件、管理用户讨论、使用XML连接Web服务，以及使用基于Ajax的交互性开发Web 2.0应用。<br/>　　与上一版相比，本书经过了更新、重写以及扩展，并涵盖了PHP 5到5.3的所有特性，例如命名空间和闭包以及MySQL 5.1引入的特性。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-4\" name=\"detail-tag-id-4\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>作者简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p><strong>　　Laura Thomson，<\/strong>Mozilla\r\n公司的高级软件工程师。之前，她是OmniTI公司和Tangled Web \r\nDesign公司的合伙人。此外，Laura曾经在RMIT大学和波士顿顾问集团工作过。她获得了应用科学（计算机科学）的学士学位和工程学（计算机系统\r\n工程）学士学位。在她的空闲时间，她非常喜欢骑马，讨论免费软件和开源软件以及睡觉。<\/p><p><br/><strong>　　Luke Welling，<\/strong>OmniTI\r\n公司的一位Web架构师，他经常在一些国际会议（例如，OSCON，ZendCon，MySQLUC，HPCon，OSDC以及LinuxTag）中就开\r\n源和Web开发的话题发表演讲。在加入OmniTI公司之前，他曾作为数据库提供商的Web分析师为Hitwise.com公司工作。此外，他还是\r\nTangled Web \r\nDesign公司的独立顾问。他还在澳大利亚墨尔本的RMIT大学教授计算机科学课程。他获得了应用科学（计算机科学）的学士学位。在他的空闲时间，他希\r\n望治好他的失眠症。<\/p><p><br/><strong>　　其他参与者：<br/><br/>　　Julie C. Meloni，<\/strong>i2i\r\n Interactive 公司的技术总监，这是一家位于加利弗里亚Los Altos的多媒体公司。她从Web一问世以及出现GUI \r\nWeb浏览器时就致力于基于Web的应用开发。她编著过大量书籍，撰写过大量关于Web开发语言和数据的问题，其中包括销售情况良好的《Sams \r\nTeach Yourself PHP，MySQL, and Apache All in One》。<\/p><p><br/><strong>　　Adam DeFields，<\/strong>Web\r\n应用开发方面，项目管理以及UI设计方面的顾问。他居住在密歇根的Grand Rapids。在这个城市，有他自己的公司Emanation \r\nSystems，LLC，这是一家在2002年成立的公司。他参加过使用不同技术实现的Web开发项目，但是，他还是最喜欢开发基于PHP/MySQL的\r\n项目。<\/p><p><br/><strong>　　Marc Wandschneider，<\/strong>一个软件开发方面的自由职业者，此外他还是\r\n作家和演讲者，经常在全球范围参与有意思的项目开发。最近，他的注意力集中在编写健壮和可扩展的Web应用。在2005年，他编写了一本名为《Core \r\nWeb Application Programming with PHP and \r\nMySQL》的图书。此前，他是SWiK开源社区的主要开发人员。目前，Marc居住在北京，他将他的时间花在中文学习和编程。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-6\" name=\"detail-tag-id-6\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>目录<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\">读者反馈<br/>译者序<br/>前言<br/>作者简介<br/>第一篇 使用PHP<br/>第1章 PHP快速入门教程<br/>1.1 开始之前：了解PHP<br/>1.2 创建一个示例应用：Bob汽车零部件商店<br/>1.2.1 创建订单表单<br/>1.2.2 表单处理<br/>1.3 在HTML中嵌入PHP<br/>1.3.1 使用PHP标记<br/>1.3.2 PHP语句<br/>1.3.3 空格<br/>1.3.4 注释<br/>1.4 添加动态内容<br/>1.4.1 调用函数<br/>1.4.2 使用date()函数<br/>1.5 访问表单变量<br/>1.5.1 简短、中等以及长风格的表单变量<br/>1.5.2 字符串的连接<br/>1.5.3 变量和文本<br/>1.6 理解标识符<br/>1.7 检查变量类型<br/>1.7.1 PHP的数据类型<br/>1.7.2 类型强度<br/>1.7.3 类型转换<br/>1.7.4 可变变量<br/>1.8 声明和使用常量<br/>1.9 理解变量的作用域<br/>1.10 使用操作符<br/>1.10.1 算术操作符<br/>1.10.2 字符串操作符<br/>1.10.3 赋值操作符<br/>1.10.4 比较操作符<br/>1.10.5 逻辑操作符<br/>1.10.6 位操作符<br/>1.10.7 其他操作符<br/>1.11 &nbsp;计算表单总金额<br/>1.12 &nbsp;理解操作符的优先级和结合性：<br/>1.13 使用可变函数<br/>1.13.1 测试和设置变量类型<br/>1.13.2 测试变量状态<br/>1.13.3 变量的重解释<br/>1.14 根据条件进行决策<br/>1.14.1 if语句<br/>1.14.2 代码块<br/>1.14.3 else语句<br/>1.14.4 elseif语句<br/>1.14.5 switch语句<br/>1.14.6 比较不同的条件<br/>1.15 通过迭代实现重复动作<br/>1.15.1 while循环<br/>1.15.2 for和foreach循环<br/>1.15.3 do...while循环<br/>1.16 从控制结构或脚本中跳出<br/>1.17 使用可替换的控制结构语法<br/>1.18 使用declare<br/>1.19 下一章<br/><br/>第2章 数据的存储与检索<br/>2.1 保存数据以便后期使用<br/>2.2 存储和检索Bob的订单<br/>2.3 文件处理<br/>2.4 打开文件<br/>2.4.1 选择文件模式<br/>2.4.2 使用fopen()打开文件<br/>2.4.3 通过FTP或HTTP打开文件<br/>2.4.4 解决打开文件时可能遇到的问题<br/>2.5 写文件<br/>2.5.1 fwrite()的参数<br/>2.5.2 文件格式<br/>2.6 关闭文件<br/>2.7 读文件<br/>2.7.1 以只读模式打开文件：fopen()<br/>2.7.2 知道何时读完文件：feof()<br/>2.7.3 每次读取一行数据：fgets()、fgetss()和fgetcsv()<br/>2.7.4 读取整个文件：readfile()、fpassthru()和file()<br/>2.7.5 读取一个字符：fgetc()<br/>2.7.6 读取任意长度：fread()<br/>2.8 使用其他有用的文件函数<br/>2.8.1 查看文件是否存在：file_exists()<br/>2.8.2 确定文件大小：filesize()<br/>2.8.3 删除一个文件：unlink()<br/>2.8.4 在文件中定位：rewind()、fseek()和ftell()<br/>2.9 文件锁定<br/>2.10 更好的方式：数据库管理系统<br/>2.10.1 使用普通文件的几个问题<br/>2.10.2 &nbsp;RDBMS是如何解决这些问题的<br/>2.11 进一步学习<br/>2.12 下一章<br/><br/>第3章 使用数组<br/>3.1 什么是数组<br/>3.2 数字索引数组<br/>3.2.1 数字索引数组的初始化<br/>3.2.2 访问数组的内容<br/>3.2.3 使用循环访问数组<br/>3.3 使用不同索引的数组<br/>3.3.1 初始化相关数组<br/>3.3.2 访问数组元素<br/>3.3.3 使用循环语句<br/>3.4 数组操作符<br/>3.5 多维数组<br/>3.6 数组排序<br/>3.6.1 使用sort()函数<br/>3.6.2 使用asort()函数和ksort()函数对相关数组排序<br/>3.6.3 反向排序<br/>3.7 多维数组的排序<br/>3.7.1 用户定义排序<br/>3.7.2 反向用户排序<br/>3.8 对数组进行重新排序<br/>3.8.1 使用shuffle()函数<br/>3.8.2 使用array_reverse()函数<br/>3.9 从文件载入数组<br/>3.10 执行其他的数组操作<br/>3.10.1 在数组中浏览：each()、current()、reset()、end()、next()、pos()和prev()<br/>3.10.2 对数组的每一个元素应用任何函数：array_walk()<br/>3.10.3 统计数组元素个数：count()、sizeof()和array_count_values()<br/>3.10.4 将数组转换成标量变量：extract()<br/>3.11 进一步学习<br/>3.12 下一章<br/><br/>第4章 字符串操作与正则表达式<br/>4.1 创建一个示例应用程序：智能表单邮件<br/>4.2 字符串的格式化<br/>4.2.1 字符串的整理：chop()、ltrim()和trim()<br/>4.2.2 格式化字符串以便显示<br/>4.2.3 格式化字符串以便存储：addslashes()和stripslashes()<br/>4.3 用字符串函数连接和分割字符串<br/>4.3.1 使用函数explode()、implode()和join()<br/>4.3.2 使用strtok()函数<br/>4.3.3 使用substr()函数<br/>4.4 字符串的比较<br/>4.4.1 字符串的排序：strcmp()、strcasecmp()和strnatcmp()<br/>4.4.2 使用strlen()函数测试字符串的长度<br/>4.5 使用字符串函数匹配和替换子字符串<br/>4.5.1 在字符串中查找字符串：strstr()、strchr()、strrchr()和stristr()<br/>4.5.2 查找子字符串的位置：strpos()、strrpos()<br/>4.5.3 替换子字符串：str_replace()、substr_replace()<br/>4.6 正则表达式的介绍<br/>4.6.1 基础知识<br/>4.6.2 字符集和类<br/>4.6.3 重复<br/>4.6.4 子表达式<br/>4.6.5 子表达式计数<br/>4.6.6 定位到字符串的开始或末尾<br/>4.6.7 分支<br/>4.6.8 匹配特殊字符<br/>4.6.9 特殊字符一览<br/>4.6.10 在智能表单中应用<br/>4.7 用正则表达式查找子字符串<br/>4.8 使用正则表达式分割字符串<br/>4.9 比较字符串函数和正则表达式函数<br/>4.10 进一步学习<br/>4.11 下一章<br/><br/>第5章 代码重用与函数编写<br/>5.1 代码重用的好处<br/>5.1.1 成本<br/>5.1.2 可靠性<br/>5.1.3 一致性<br/>5.2 使用require()和include()函数<br/>5.2.1 文件扩展名和require()语句<br/>5.2.2 使用require()制作Web站点的模版<br/>5.2.3 使用auto_prepend_file和auto_append_file<br/>5.3 在PHP中使用函数<br/>5.3.1 调用函数<br/>5.3.2 调用未定义的函数<br/>5.3.3 理解字母大小写和函数名称<br/>5.4 理解为什么要定义自己的函数<br/>5.5 了解基本的函数结构<br/>5.5.1 函数命名<br/>5.6 使用参数<br/>5.7 理解作用域<br/>5.8 参数的引用传递和值传递<br/>5.9 &nbsp;使用Return关键字<br/>5.9.1 从函数返回一个值<br/>5.10 &nbsp;实现递归<br/>5.10.1 名称空间<br/>5.11 进一步学习<br/>5.12 下一章<br/><br/>第6章 面向对象的PHP<br/>6.1 理解面向对象的概念<br/>6.1.1 类和对象<br/>6.1.2 多态性<br/>6.1.3 继承<br/>6.2 在PHP中创建类、属性和操作<br/>6.2.1 类的结构<br/>6.2.2 构造函数<br/>6.2.3 析构函数<br/>6.3 类的实例化<br/>6.4 使用类的属性<br/>6.5 使用private和public关键字控制访问<br/>6.6 类操作的调用<br/>6.7 在PHP中实现继承<br/>6.7.1 通过继承使用private和protected访问修饰符控制可见性<br/>6.7.2 重载<br/>6.7.3 使用final关键字禁止继承和重载<br/>6.7.4 理解多重继承<br/>6.7.5 实现接口<br/>6.8 类的设计<br/>6.9 编写类代码<br/>6.10 理解PHP面向对象新的高级功能<br/>6.10.1 使用Per-Class常量<br/>6.10.2 实现静态方法<br/>6.10.3 检查类的类型和类型提示<br/>6.10.4 克隆对象<br/>6.10.5 使用抽象类<br/>6.10.6 使用__call()重载方法<br/>6.10.7 使用__autoload()方法<br/>6.10.8 实现迭代器和迭代<br/>6.10.9 将类转换成字符串<br/>6.10.10 使用Reflection（反射）API<br/>6.11 下一章<br/><br/>第7章 &nbsp;错误和 异常处理<br/>7.1 异常处理的概念<br/>7.2 Exception类<br/>7.3 用户自定义异常<br/>7.4 Bob的汽车零部件商店应用程序的异常<br/>7.5 异常和PHP的其他错误处理机制<br/>7.6 进一步学习<br/>7.7 下一章<br/><br/>第二篇 使用MySQL<br/>第8章 设计Web数据库<br/>8.1 关系数据库的概念<br/>8.1.1 表格<br/>8.1.2 列<br/>8.1.3 行<br/>8.1.4 值<br/>8.1.5 键<br/>8.1.6 模式<br/>8.1.7 关系<br/>8.2 如何设计Web数据库<br/>8.2.1 考虑要建模的实际对象<br/>8.2.2 避免保存冗余数据<br/>8.2.3 使用原子列值<br/>8.2.4 选择有意义的键<br/>8.2.5 考虑需要询问数据库的问题<br/>8.2.6 避免多个空属性的设计<br/>8.2.7 表格类型的总结<br/>8.3 Web数据库架构<br/>8.4 进一步学习<br/>8.5 下一章<br/><br/>第9章 创建Web数据库<br/>9.1 使用MySQL监视程序<br/>9.2 登录到MySQL<br/>9.3 创建数据库和用户<br/>9.4 设置用户与权限<br/>9.5 MySQL权限系统的介绍<br/>9.5.1 最少权限原则<br/>9.5.2 创建用户：GRANT命令<br/>9.5.3 权限的类型和级别<br/>9.5.4 REVOKE命令<br/>9.5.5 使用GRANT和REVOKE的例子<br/>9.6 创建一个Web用户<br/>9.7 使用正确的数据库<br/>9.8 创建数据库表<br/>9.8.1 理解其他关键字的意思<br/>9.8.2 理解列的类型<br/>9.8.3 用SHOW和DESCRIBE来查看数据库<br/>9.8.4 创建索引<br/>9.9 理解MySQL的标识符<br/>9.10 选择列数据类型<br/>9.10.1 数字类型<br/>9.10.2 日期和时间类型<br/>9.10.3 字符串类型<br/>9.11 进一步学习<br/>9.12 下一章<br/><br/>第10章 使用MySQL数据库<br/>10.1 SQL是什么<br/>10.2 在数据库中插入数据<br/>10.3 从数据库中获取数据<br/>10.3.1 获取满足特定条件的数据<br/>10.3.2 从多个表中获取数据<br/>10.3.3 以特定的顺序获取数据<br/>10.3.4 分组与合计数据<br/>10.3.5 选择要返回的行<br/>10.3.6 使用子查询<br/>10.4 更新数据库记录<br/>10.5 创建后修改表<br/>10.6 删除数据库中的记录<br/>10.7 表的删除<br/>10.8 删除整个数据库<br/>10.9 进一步学习<br/>10.10 下一章<br/><br/>第11章 使用PHP从Web访问MySQL数据库<br/>11.1 Web数据库架构的工作原理<br/>11.2 从Web查询数据库的基本步骤<br/>11.2.1 检查与过滤用户输入数据<br/>11.2.2 建立一个连接<br/>11.2.3 &nbsp;选择使用的数据库<br/>11.2.4 查询数据库<br/>11.2.5 检索查询结果<br/>11.2.6 从数据库断开连接<br/>11.3 将新信息放入数据库<br/>11.4 使用Prepared语句<br/>11.5 使用PHP与数据库交互的其他接口<br/>11.5.1 使用常规的数据库接口：PEAR MDB2<br/>11.6 进一步学习<br/>11.7 下一章<br/><br/>第12章 MySQL高级管理<br/>12.1 深入理解权限系统<br/>12.1.1 user表<br/>12.1.2 db表和host表<br/>12.1.3 tables_priv表，columns_priv表和procs_priv表<br/>12.1.4 访问控制：MySQL如何使用Grant表<br/>12.1.5 更新权限：修改什么时候生效<br/>12.2 提高MySQL数据库的安全性<br/>12.2.1 从操作系统角度来保护MySQL<br/>12.2.2 密码<br/>12.2.3 用户权限<br/>12.2.4 Web问题<br/>12.3 获取更多关于数据库的信息<br/>12.3.1 使用SHOW获取信息<br/>12.3.2 使用DESCRIBE获取关于列的信息<br/>12.3.3 用EXPLAIN理解查询操作的工作过程<br/>12.4 数据库的优化<br/>12.4.1 设计优化<br/>12.4.2 权限<br/>12.4.3 表的优化<br/>12.4.4 使用索引<br/>12.4.5 使用默认值<br/>12.4.6 其他技巧<br/>12.5 备份MySQL数据库<br/>12.6 恢复MySQL数据库<br/>12.7 实现复制<br/>12.7.1 设置主服务器<br/>12.7.2 执行初始的数据传输<br/>12.7.3 设置一个/多个从服务器<br/>12.8 进一步学习<br/>12.9 下一章<br/><br/>第13章 MySQL高级编程<br/>13.1 LOAD DATA INFILE语句<br/>13.2 存储引擎<br/>13.3 事务<br/>13.3.1 理解事务的定义<br/>13.3.2 通过InnoDB使用事务<br/>13.4 外键<br/>13.5 存储过程<br/>13.5.1 基本示例<br/>13.5.2 局部变量<br/>13.5.3 游标和控制结构<br/>13.6 进一步学习<br/>13.7 下一章<br/><br/>第三篇 电子商务与安全性<br/>第14章 运营一个电子商务网站<br/>14.1 我们要实现什么目标<br/>14.2 考虑电子商务网站的类型<br/>14.2.1 使用在线说明书公布信息<br/>14.2.2 接收产品或服务的订单<br/>14.2.3 提供服务和数字产品<br/>14.2.4 为产品或服务增值<br/>14.2.5 减少成本<br/>14.3 理解风险和威胁<br/>14.3.1 网络黑客<br/>14.3.2 不能招揽足够的生意<br/>14.3.3 计算机硬件故障<br/>14.3.4 电力、通信、网络或运输故障<br/>14.3.5 广泛的竞争<br/>14.3.6 软件错误<br/>14.3.7 不断变化的政府政策和税收<br/>14.3.8 系统容量限制<br/>14.4 选择一个策略<br/>14.5 下一章<br/><br/>第15章 电子商务的安全问题<br/>15.1 信息的重要程度<br/>15.2 安全威胁<br/>15.2.1 机密数据的泄露<br/>15.2.2 数据丢失和数据破坏<br/>15.2.3 数据修改<br/>15.2.4 拒绝服务<br/>15.2.5 软件错误<br/>15.2.6 否认<br/>15.3 易用性，性能、成本和安全性<br/>15.4 建立一个安全政策<br/>15.5 身份验证原则<br/>15.6 加密技术基础<br/>15.6.1 私有密钥加密<br/>15.6.2 &nbsp;公有密钥加密<br/>15.6.3 数字签名<br/>15.7 数字证书<br/>15.8 安全的Web服务器<br/>15.9 审计与日志记录<br/>15.10 防火墙<br/>15.11 备份数据<br/>15.11.1 备份常规文件<br/>15.11.2 备份与恢复MySQL数据库<br/>15.12 自然环境安全<br/>15.13 下一章<br/><br/>第16章 &nbsp;Web应用的安全<br/>16.1处理安全性问题的策略<br/>16.1.1 以正确心态为开始<br/>16.1.2 安全性和可用性之间的平衡<br/>16.1.3 安全监视<br/>16.1.4 基本方法<br/>16.2 识别所面临的威胁<br/>16.2.1 访问或修改敏感数据<br/>16.2.2 数据丢失或破坏<br/>16.2.3 拒绝服务<br/>16.2.4 恶意代码注入<br/>16.2.5 服务器被攻破<br/>16.3了解与我们\u201c打交道\u201d的用户<br/>16.3.1 破解人员<br/>16.3.2 受影响机器的未知情用户<br/>16.3.3 对公司不满的员工<br/>16.3.4 硬件被盗<br/>16.3.5 我们自身<br/>16.4 代码的安全性<br/>16.4.1 过滤用户输入<br/>16.4.2 转义输出<br/>16.4.3 代码组织<br/>16.4.4 代码自身的问题<br/>16.4.5 文件系统因素<br/>16.4.6 代码稳定性和缺陷<br/>16.4.7 执行引号和exec<br/>16.5 Web服务器和PHP的安全性<br/>16.5.1 保持软件的更新<br/>16.5.2 查看php.ini文件<br/>16.5.3 &nbsp;Web服务器配置<br/>16.5.4 Web应用的商业主机服务<br/>16.6 数据库服务器的安全性<br/>16.6.1 用户和权限系统<br/>16.6.2发送数据至服务器<br/>16.6.3 连接服务器<br/>16.6.4 运行服务器<br/>16.7 保护网络<br/>16.7.1 安装防火墙<br/>16.7.2使用隔离区域（DMZ）<br/>16.7.3应对DoS和DDoS攻击<br/>16.8 计算机和操作系统的安全性<br/>16.8.1 保持操作系统的更新<br/>16.8.2只运行必须的软件<br/>16.8.3 服务器的物理安全性<br/>16.9 灾难计划<br/>16.10 下一章<br/><br/>第17章 使用PHP和MySQL实现身份验证<br/>17.1 识别访问者<br/>17.2 实现访问控制<br/>17.2.1 保存密码<br/>17.2.2 密码的加密<br/>17.2.3 保护多个网页<br/>17.3 使用基本身份验证<br/>17.4 在PHP中使用基本身份验证<br/>17.5 在Apache的.htaccess文件中使用基本身份验证<br/>17.6 使用mod_auth_mysql身份验证<br/>17.6.1 安装mod_auth_mysql<br/>17.6.2 使用mod_auth_mysql<br/>17.7 创建自定义身份验证<br/>17.8 进一步学习<br/>17.9 下一章<br/><br/>第18章 使用PHP和MySQL实现安全事务<br/>18.1 提供安全的事务处理<br/>18.1.1 用户机器<br/>18.1.2 Internet<br/>18.1.3 我们的系统<br/>18.2 使用加密套接字层（SSL）<br/>18.3 屏蔽用户的输入<br/>18.4 提供安全存储<br/>18.5 存储信用卡号码<br/>18.6 在PHP中使用加密技术<br/>18.6.1 安装GPG<br/>18.6.2 测试GPG<br/>18.7 进一步学习<br/>18.8 下一章<br/><br/>第四篇 PHP的高级技术<br/>第19章 与文件系统和服务器的交互<br/>19.1 文件上载<br/>19.1.1 文件上载的HTML代码<br/>19.1.2 编写处理文件的PHP<br/>19.1.3 避免常见上载问题<br/>19.2 使用目录函数<br/>19.2.1 从目录读取<br/>19.2.2 获得当前目录的信息<br/>19.2.3 创建和删除目录<br/>19.3 与文件系统的交互<br/>19.3.1 获取文件信息<br/>19.3.2 更改文件属性<br/>19.3.3 创建、删除和移动文件<br/>19.4 使用程序执行函数<br/>19.5 与环境变量交互：getenv()和putenv()<br/>19.6 进一步学习<br/>19.7 下一章<br/><br/>第20章 使用网络函数和协议函数<br/>20.1 了解可供使用的协议<br/>20.2 发送和读取电子邮件<br/>20.3 使用其他Web站点的数据<br/>20.4 使用网络查找函数<br/>20.5 备份或镜像一个文件<br/>20.5.1 使用FTP备份或镜像一个文件<br/>20.5.2 上传文件<br/>20.5.3 避免超时<br/>20.5.4 使用其他的FTP函数<br/>20.6 进一步学习<br/>20.7 下一章<br/><br/>第21章 日期和时间的管理<br/>21.1 在PHP中获取日期和时间<br/>21.1.1 使用date()函数<br/>21.1.2 使用UNIX时间戳<br/>21.1.3 使用getdate()函数<br/>21.1.4 使用checkdate()函数检验日期有效性<br/>21.1.5 格式化时间戳<br/>21.2 在PHP日期格式和MySQL日期格式之间进行转换<br/>21.3 在PHP中计算日期<br/>21.4 在MySQL中计算日期<br/>21.5 使用微秒<br/>21.6 使用日历函数<br/>21.7 进一步学习<br/>21.8 下一章<br/><br/>第22章 创建图像<br/>22.1 在PHP中设置图像支持<br/>22.2 理解图像格式<br/>22.2.1 JPEG<br/>22.2.2 PNG<br/>22.2.3 WBMP<br/>22.2.4 GIF<br/>22.3 创建图像<br/>22.3.1 创建一个背景图像<br/>22.3.2 在图像上绘图或打印文本<br/>22.3.3 输出最终图形<br/>22.3.4 清理<br/>22.4 在其他页面中使用自动生成的图像<br/>22.5 使用文本和字体创建图像<br/>22.5.1 创建基本画布<br/>22.5.2 将文本调整到适合按钮<br/>22.5.3 放置文本<br/>22.5.4 将文本写到按钮上<br/>22.5.5 完成<br/>22.6 绘制图像与用图表描绘数据<br/>22.7 使用其他的图像函数<br/>22.8 进一步学习<br/>22.9 下一章<br/><br/>第23章 在PHP中使用会话控制<br/>23.1 什么是会话控制<br/>23.2 理解基本的会话功能<br/>23.2.1 什么是cookie<br/>23.2.2 通过PHP设置cookie<br/>23.2.3 在会话中使用cookie<br/>23.2.4 存储会话 ID<br/>23.3 实现简单的会话<br/>23.3.1 开始一个会话<br/>23.3.2 注册一个会话变量<br/>23.3.3 使用会话变量<br/>23.3.4 注销变量与销毁会话<br/>23.4 创建一个简单的会话例子<br/>23.5 配置会话控制<br/>23.6 通过会话控制实现身份验证<br/>23.7 进一步学习<br/>23.8 下一章<br/><br/>第24章 其他有用的特性<br/>24.1 使用eval()函数对字符串求值<br/>24.2 终止执行：die和exit<br/>24.3 序列化变量和对象<br/>24.4 获取PHP环境信息<br/>24.4.1 找到所加载的PHP扩展部件<br/>24.4.2 识别脚本所有者<br/>24.4.3 确定脚本最近修改时间<br/>24.5 暂时改变运行时环境<br/>24.6 源代码加亮<br/>24.7 在命令行中使用PHP<br/>24.8 下一章<br/><br/>第五篇 创建实用的PHP和MySQL项目<br/>第25章 在大型项目中使用PHP和MySQL<br/>25.1 在Web开发中应用软件工程<br/>25.2 规划和运行Web应用程序项目<br/>25.3 重用代码<br/>25.4 编写可维护代码<br/>25.4.1 编码标准<br/>25.4.2 分解代码<br/>25.4.3 使用标准的目录结构<br/>25.4.4 文档化和共享内部函数<br/>25.5 实现版本控制<br/>25.6 选择一个开发环境<br/>25.7 项目的文档化<br/>25.8 建立原型<br/>25.9 将逻辑和内容分离<br/>25.10 优化代码<br/>25.10.1 使用简单优化<br/>25.10.2 使用Zend产品<br/>25.11 测试<br/>25.12 进一步学习<br/>25.13 下一章<br/><br/>第26章 调试<br/>26.1 编程错误<br/>26.1.1 语法错误<br/>26.1.2 运行时错误<br/>26.1.3 逻辑错误<br/>26.2 使用变量帮助调试<br/>26.3 错误报告级别<br/>26.4 改变错误报告设置<br/>26.5 触发自定义错误<br/>26.6 巧妙地处理错误<br/>26.7 下一章<br/><br/>第27章 建立用户身份验证机制和个性化设置<br/>27.1 解决方案的组成<br/>27.1.1 用户识别和个性化设置<br/>27.1.2 保存书签<br/>27.1.3 推荐书签<br/>27.2 解决方案概述<br/>27.3 实现数据库<br/>27.4 实现基本的网站<br/>27.5 实现用户身份验证<br/>27.5.1 注册<br/>27.5.2 登录<br/>27.5.3 登出<br/>27.5.4 修改密码<br/>27.5.5 重设遗忘的密码<br/>27.6 实现书签的存储和检索<br/>27.6.1 添加书签<br/>27.6.2 显示书签<br/>27.6.3 删除书签<br/>27.7 实现书签推荐<br/>27.8 考虑可能的扩展<br/>27.9 下一章<br/><br/>第28章 创建一个购物车<br/>28.1 解决方案的组成<br/>28.1.1 创建一个在线目录<br/>28.1.2 在用户购买商品的时候记录购买行为<br/>28.1.3 实现一个付款系统<br/>28.1.4 创建一个管理界面<br/>28.2 解决方案概述<br/>28.3 实现数据库<br/>28.4 实现在线目录<br/>28.4.1 列出目录<br/>28.4.2 列出一个目录中的所有图书<br/>28.4.3 显示图书详细信息<br/>28.5 实现购物车<br/>28.5.1 使用show_cart.php脚本<br/>28.5.2 浏览购物车<br/>28.5.3 将物品添加到购物库<br/>28.5.4 保存更新后的购物车<br/>28.5.5 打印标题栏摘要<br/>28.5.6 结账<br/>28.6 实现付款<br/>28.7 实现一个管理界面<br/>28.8 扩展该项目<br/>28.9 使用一个已有系统<br/>28.10 下一章<br/><br/>第29章 创建一个基于Web的电子邮件服务系统<br/>29.1 解决方案的组成<br/>29.1.1 电子邮件协议：POP3和IMAP<br/>29.1.2 PHP对POP3和IMAP的支持<br/>29.2 解决方案概述<br/>29.3 建立数据库<br/>29.4 了解脚本架构<br/>29.5 登录与登出<br/>29.6 建立账户<br/>29.6.1 创建一个新账户<br/>29.6.2 修改已有账户<br/>29.6.3 删除账户<br/>29.7 阅读邮件<br/>29.7.1 选择账户<br/>29.7.2 查看邮箱内容<br/>29.7.3 阅读邮件消息<br/>29.7.4 查看消息标题<br/>29.7.5 删除邮件<br/>29.8 发送邮件<br/>29.8.1 发送一则新消息<br/>29.8.2 回复或转发邮件<br/>29.9 扩展这个项目<br/>29.10 下一章<br/><br/>第30章 创建一个邮件列表管理器<br/>30.1 解决方案的组成<br/>30.1.1 建立列表和订阅者数据库<br/>30.1.2 上载新闻信件<br/>30.1.3 发送带附件的邮件<br/>30.2 解决方案概述<br/>30.3 建立数据库<br/>30.4 定义脚本架构<br/>30.5 实现登录<br/>30.5.1 新账户的创建<br/>30.5.2 登录<br/>30.6 用户函数的实现<br/>30.6.1 查看列表<br/>30.6.2 查看邮件列表信息<br/>30.6.3 查看邮件列表存档<br/>30.6.4 订阅与取消订阅<br/>30.6.5 更改账户设置<br/>30.6.6 更改密码<br/>30.6.7 登出<br/>30.7 管理功能的实现<br/>30.7.1 创建新的邮件列表<br/>30.7.2 上载新的新闻信件<br/>30.7.3 多文件上载的处理<br/>30.7.4 预览新闻信件<br/>30.7.5 发送邮件<br/>30.8 扩展这个项目<br/>30.9 下一章<br/><br/>第31章 创建一个Web论坛<br/>31.1 理解流程<br/>31.2 解决方案的组成<br/>31.3 解决方案概述<br/>31.4 数据库的设计<br/>31.5 查看文章的树型结构<br/>31.5.1 展开和折叠<br/>31.5.2 显示文章<br/>31.5.3 使用treenode类<br/>31.6 查看单个的文章<br/>31.7 添加新文章<br/>31.8 添加扩充<br/>31.9 使用一个已有的系统<br/>31.10 下一章<br/><br/>第32章 生成PDF格式的个性化文档<br/>32.1 项目概述<br/>32.1.1 评估文档格式<br/>32.2 解决方案的组成<br/>32.2.1 问题与回答系统<br/>32.2.2 文档生成软件<br/>32.3 解决方案概述<br/>32.3.1 提问<br/>32.3.2 给答题评分<br/>32.3.3 生成RTF证书<br/>32.3.4 从模板生成PDF证书<br/>32.3.5 使用PDFlib生成PDF文档<br/>32.3.6 使用PDFlib的一个\u201cHello World\u201d程序<br/>32.3.7 用PDFlib生成证书<br/>32.4 处理标题的问题<br/>32.5 扩展该项目<br/>32.6 下一章<br/><br/>第33章 使用XML和SOAP来连接Web服务<br/>33.1 项目概述：使用XML和Web服务<br/>33.1.1 理解XML<br/>33.1.2 理解Web服务<br/>33.2 解决方案的组成<br/>33.2.1 使用Amazon的Web服务接口<br/>33.2.2 &nbsp;XML的解析：REST响应<br/>33.2.3 在PHP中使用SOAP<br/>33.2.4 缓存<br/>33.3 解决方案概述<br/>33.3.1 核心应用程序<br/>33.3.2 显示特定种类的图书<br/>33.3.3 获得一个AmazonResultSet类<br/>33.3.4 使用REST发送和接收请求<br/>33.3.5 使用SOAP发送和接收请求<br/>33.3.6 缓存请求返回的数据<br/>33.3.7 创建购物车<br/>33.3.8 到Amazon付账<br/>33.4 安装项目代码<br/>33.5 扩展这个项目<br/>33.6 进一步学习<br/><br/>第34 章使用Ajax构建Web 2.0应用<br/>34.1 Ajax 是什么？<br/>34.1.1 HTTP请求和响应<br/>34.1. 2 DHTML和XHTML<br/>34.1.3 级联样式单（CSS）<br/>34.1.4 客户端编程<br/>34.1.5 服务器端编程<br/>34.1.6 XML和XSLT<br/>34.2 Ajax基础<br/>34.2.1 XMLHTTPRequest对象<br/>34.2.2 与服务器通信<br/>34.2.3 处理服务器响应<br/>34.2.4 整合应用<br/>34.3 在以前的项目添加Ajax元素<br/>34.3.1在PHPBookmark应用中添加Ajax元素<br/>34.4 进一步学习<br/>34.4.1 进一步了解文档对象模型（DOM）<br/>34.4.2 Ajax应用可用的JavaScript函数库<br/>34.4.3 Ajax开发人员网站<br/><br/>第六篇 附录<br/>附录A 安装PHP及MySQL<br/>附录B Web资源<br/>第1章 PHP快速入门教程<br/>第2章 数据的存储与检索<br/>第3章 使用数组<br/>第4章 字符串操作与正则表达式<br/>第5章 代码重用与函数编写<br/>第6章 面向对象的PHP<br/>第7章 错误和异常处理<\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-6\">查看全部↓<\/a><\/div><\/div><div id=\"detail-tag-id-7\" name=\"detail-tag-id-7\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>精彩书摘<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\"><p>　　5.1 代码重用的好处<br/>　\r\n　软件工程师的一个目标就是通过重复使用代码来避免编写新的代码。这样做并不是因为他们懒，而是因为重新使用已有的代码可以降低成本、增加代码的可靠性并\r\n提高它们的一致性。在理想情况下，一个新的项目是这样创建的：它将已有的可重新利用的组件进行组合，并将新的开发难度降低到最小。<br/>　　5.1.1 成本<br/>　\r\n　在一个软件的有效生命周期中，相当多的时间是用在维护、修改、测试和文档化记录上，而不是最初花在编码上的时间。如果要编写商业代码，应该尽量限制结构\r\n中所用到的代码行数。一个最常使用的方法就是：重新使用已有的代码，而不是为一个新任务编写一个和原来代码只有微小区别的新代码。更少的代码意味着更低的\r\n成本。如果市场上已经存在能够满足需求的软件，那就购买软件。购买已有软件的成本总是要小于开发一个等价产品的成本。如果有现成的软件基本上能够满足要\r\n求，那就必须小心地使用它。修改已有的代码可能会比编写新代码更加困难。<br/>　　5.1.2 可靠性<br/>　　如果一个模块代码已经在代码结构中使\r\n用了，可以认为它是已经通过测试的。即使代码只有几行，在重写时仍然可能忽略两方面的内容，一是原作者融入其中的某些东西，二是代码测试发现缺陷后，对原\r\n来代码添加的一些东西。使用现存的成熟的代码通常要比新鲜的\u201c绿色\u201d代码更可靠。<br/>　　5.1.3 一致性<br/>　　系统的外部接口应该是一致的，其中包括用户接口和系统的外部接口。编写一段新的并且能够和系统函数的其他部分保持一致的代码需要花些心思和努力。如果重复使用运行在系统其他部分的代码，所实现的功能自然就会达到一致。<br/>　　除了这些优点外，只要原来的代码是模块化的而且编写良好，那么重复使用代码还会节省许多工作。在工作时，可以试着辨认一下今后可能再次要调用的代码段。<br/>　　5.2 使用require（）和include（）函数<br/>　\r\n　PHP提供了两个非常简单却很有用的语句，它们允许重新使用任何类型的代码。使用一条require（）或include（）语句，可以将一个文件载入\r\n到PHP脚本中。通常，这个文件可以包含任何希望在一个脚本中输入的内容，其中包括PHP语句、文本、HTML标记、PHP函数或PHP类。<br/>　　这些语句的工作方式类似于大多数Web服务器提供的服务器端包含方式以及C语言或C++中的#include语句。<br/>　　require（）和include（）几乎是相同的。二者唯一的区别在于函数失败后，require（）函数将给出一个致命的错误。而include（）只是给出一个警告。<br/>　\r\n　require（）和include（）也有两个变体函数，分别是require_once（）和include_once（）。正如你可能猜到的，这\r\n两个函数的作用是一个被引入（included）的文件只能被引入一次。对于我们已经介绍过的例子\u2014\u2014页眉和脚注（header and \r\nfooter）\u2014\u2014这个功能并不是非常有用。<br/>　　当使用require（）和include（）来引入函数库时，它们才非常有用。使用这两个函数可以防止错误的引入同样的函数库两次，从而出现重复定义的错误。如果关心编码实践，可以考虑使用require（）和include（），因为它们的运行速度较快。<br/>　　5.2.1 文件扩展名和require（）函数<br/>　　如下所示的代码保存于reusable.php文件中：<br/>　　如下所示的代码保存于main.php文件中：<br/>　　如果载入reusable.php，当浏览器中显示出\u201cHere is a very simple PHP statement\u201d时，你不会感到奇怪。如果载入main.php，则会发生一件更有趣的事情。该脚本输出结果如图5-1所示。<br/>　　当需要一个文件的时候，可以使用require（）语句。在前面的例子中，我们使用的文件是reusable.php。当运行该脚本时，require（）语句：<br/>　　将被请求的文件内容代替，然后再执行脚本。这就意味着，当载入main.php文件时，它会像如下所示的代码那样执行：<br/>　　当使用require（）语句时，必须注意处理文件扩展名和PHP标记的不同方式。<br/>　\r\n　PHP并不会查看所需文件的扩展名。这就意味着，只要不想直接调用这个文件，就可以任意命名该文件。当使用require（）语句载入文件时，它会作为\r\nPHP文件的一部分被执行。 \r\n通常，如果PHP语句放在一个HTML文件（例如，名为page.html的文件）中时，它们是不会被处理的。PHP通常用来解析扩展名被定义成\r\n如.php的文件。（在Web服务器配置文件中可能不是这样）但是，如果通过require（）语句载入这个page.html，文件内的任何PHP命令\r\n都会被处理。因此，可以使用任何扩展名来命名包含文件，但要尽量遵循一个约定，例如将扩展名命名为.inc是一个很好的办法。<br/>　　需要注意的一个\r\n问题是，如果扩展名为.inc或一些其他的非标准扩展名的文件保存在Web文档树中，而且用户可以在浏览器中直接载入它们，用户将可以以普通文本的形式查\r\n看源代码，包括任何密码。因此，将被包含文件保存在文档树之外，或使用标准的文件扩展名是非常重要的。<br/>　　提示：<br/>　　在这个例子中，可重用文件（reusable.php）代码如下所示：<br/>　　我们将文件中的PHP代码放到PHP标记之间。如果希望一个所需文件中的PHP代码能<br/>　　被当成PHP代码进行处理，就必须这样做。如果不使用PHP标记，代码将会被视为文本或者HTML脚本，因此也就不会被执行。<br/>　　5.2.2 使用require（）制作Web站点的模版<br/>　　如果Web页面具有一致的外观，可以在PHP中使用require（）语句将模版和标准元素加<br/>　　到页面中。<br/>　　例如，一个虚构的TLA咨询公司的网站有许多页面，这些页面的外观看上去都如图5-2所示。当需要一个新页面的时候，开发人员可以打开一个已有页面，从文件中间剪切所需的文本，输入所需的新文本，然后以新的文件名保存。<br/>　\r\n　考虑这种情况：网站已经存在了一段时间，如今已有数十个、数百个甚至数千个页面都是同一种风格。现在，要对标准外观进行部分修改\u2014这种修改可能是很微小\r\n的改变，例如，在每个脚注上加一个电子邮件地址，或者加上一个新的导航菜单入口。你希望对这数十个、数百个甚至数千个页面都做这种微小的修改吗？<br/>　　相对于剪切粘贴数十个、数百个甚至数千个页面，直接重用各个页面中通用的HTML代码部分是一个更好的办法。程序清单5-1给出了图5-2所示页面（home.html）的源代码。<br/>　　\u2026\u2026<\/p><\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-7\">查看全部↓<\/a><\/div><\/div><p><br/><\/p><p><br/><\/p>","goods_price":"100.00","type_id":"61","parent_id":"60","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94phnab116hmid1i2hg5a16ttc.jpg","surplus":100},{"goods_id":"3","expect":"7","goods_status":"1","open_time":"1458040169","id":"3","goods_name":"【京东全球购自营】飞利浦（PHILIPS）电动剃须刀 三刀头","goods_expect":"【京东全球购自营】飞利浦（PHILIPS）电动剃须刀 三刀头干湿两用 AT755/16 AT755 ","cover_img":["o_1a94du33f1f60pjhntlbm0ns2e.jpg","o_1a94du33g1cj2l0h1lc5pa3151jf.jpg","o_1a94du33gsr5acq17hnkkq1rdug.jpg","o_1a94du33g15qo2b81iuhkv186fh.jpg","o_1a94du33gd551mq84vh1ql41e0hi.jpg"],"goods_info":"<div id=\"detail-content\" class=\"detail-content-wrap\" align=\"center\"><div clstag=\"shangpin|keycount|product|1|canshuqu\" class=\"parameter-content\" data-lazyload-fn=\"done\"><br/><div clstag=\"shangpin|keycount|product|pop-glbs\" id=\"J-detail-pop-tpl-top-new\"><img alt=\"\" usemap=\"#Map\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2137/144/2031912902/88246/213086aa/56972cf9Nc80150c7.jpg\" border=\"0\"/><map name=\"Map\"><area target=\"_blank\" href=\"http://item.jd.hk/1955631432.html\" coords=\"342,20,647,188\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954418220.html\" coords=\"665,23,963,187\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954417861.html\" coords=\"22,204,323,373\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954417136.html\" coords=\"342,202,648,371\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954416422.html\" coords=\"664,204,966,369\" shape=\"rect\"/><\/map><\/div><div id=\"J-detail-content\" data-lazyload-install=\"1\"><img id=\"619d73de6fe1427ea5e45dd3e5f055f3\" alt=\"\" data-lazyload=\"done\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2323/325/1740579904/196935/1ef6c65e/56777827Nc84db257.jpg\" class=\"\"/> <img id=\"6d35b70e8b7c44ceb2bba11e07e6d0c5\" alt=\"\" data-lazyload=\"done\" src=\"http://img30.360buyimg.com/popWareDetail/jfs/t2500/44/1737688308/105146/e0d8f5c3/566fce7bNcf287d1f.jpg\" class=\"\"/> <img alt=\"\" data-lazyload=\"done\" src=\"//img10.360buyimg.com/imgzone/jfs/t2485/278/1199470034/192964/65aff7ee/5684af7aNc1617c75.jpg\" class=\"\"/> <img alt=\"\" data-lazyload=\"done\" src=\"http://img20.360buyimg.com/vc/jfs/t2221/249/964649066/65455/44702c00/563de888Nd3ae0177.jpg\" class=\"\" height=\"460\" width=\"750\"/> <img alt=\"\" data-lazyload=\"done\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2413/205/1509619481/129106/7be99bd3/5664efaeNafdd2e5a.jpg\" class=\"\" height=\"559\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2536/290/240701725/106577/df99bed1/563de889N6d7726b7.jpg\" height=\"624\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2500/83/1128973125/71257/6431561/563de88aN840601b3.jpg\" height=\"589\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2545/348/230255860/101636/1776dc9e/563de88aN971cd7b1.jpg\" height=\"704\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2026/60/1128984726/64149/48c529da/563de88bN73cbe631.jpg\" height=\"696\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1978/75/1133124045/87466/8bf9704e/563de88cNa9c0803b.jpg\" height=\"690\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2188/279/1038072393/77802/4ed993f6/563de88cNe609e546.jpg\" height=\"537\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2263/146/1093642381/68769/651af3/563de88dN596b0231.jpg\" height=\"557\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1900/262/1065771847/71543/f8e6703f/563de892N3bfdef72.jpg\" height=\"591\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2452/90/1091319484/92823/f03ac1e0/563de893N5d68c5e9.jpg\" height=\"643\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2497/268/1071493444/73800/eb2e1581/563de893Nd2d61f12.jpg\" height=\"524\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1927/100/1069692550/116675/e2c495ce/563de894N647360f7.jpg\" height=\"765\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2230/257/977610087/84365/eb22d823/563de894N2c18ed2f.jpg\" height=\"558\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1975/79/1113362032/102528/3b73c6f8/563de895N3700a649.jpg\" height=\"514\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2227/262/987638780/102160/77963982/563de896N6cd26b86.jpg\" height=\"488\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1891/264/985337848/123734/bb3dee0/563de897Nfc2e9fed.jpg\" height=\"601\" width=\"750\"/> <img alt=\"\" data-lazyload=\"//img10.360buyimg.com/imgzone/jfs/t2185/247/1840756327/129162/e0ad837a/5683a74fNd432c84c.jpg\"/><br/><\/div><div clstag=\"shangpin|keycount|product|pop-glbs\" id=\"J-detail-pop-tpl-bottom-new\"><\/div><\/div><div id=\"detail-param\"><table class=\"Ptable\" border=\"0\" cellpadding=\"0\" cellspacing=\"1\" width=\"100%\"><tbody><tr><th colspan=\"2\" class=\"tdTitle\">主体<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">品牌<\/td><td>飞利浦 PHILIPS<\/td><\/tr><tr><td class=\"tdTitle\">类别<\/td><td>旋转式3刀头<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">电源<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">供电方式<\/td><td>充电式<\/td><\/tr><tr><td class=\"tdTitle\">操作时长<\/td><td>40 min<\/td><\/tr><tr><td class=\"tdTitle\">充电时长<\/td><td>8小时<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">刀头<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">刀片<\/td><td>双层<\/td><\/tr><tr><td class=\"tdTitle\">刀头水洗<\/td><td>支持<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">基本规格<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">产地<\/td><td>中国<\/td><\/tr><tr><td class=\"tdTitle\">全身水洗<\/td><td>支持<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">特性<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">独特设计<\/td><td>胡茬储藏室<\/td><\/tr><tr><td class=\"tdTitle\">通用电压<\/td><td>支持<\/td><\/tr><\/tbody><\/table><\/div><div id=\"comment\"><div class=\"comment\"><div class=\"mc\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><\/div><\/div><div clstag=\"shangpin|keycount|product|comment\" data-widget=\"tabs\" class=\"m\" id=\"comments-list\" data-lazyload-fn=\"0\"><div class=\"mt\"><div class=\"mt-inner m-tab-trigger-wrap clearfix\"><ul class=\"m-tab-trigger\"><li clstag=\"shangpin|keycount|glbproduct|allpingjia\" class=\"ui-switchable-item trig-item curr\"><a href=\"http://javascript:;\">全部评价<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|haoping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">好评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|zhongping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">中评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|chaping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">差评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|shaidantab\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">有晒单的评价<em>()<\/em><\/a><\/li><\/ul><\/div><\/div><div class=\"ui-switchable-panel mc comments-table ui-switchable-panel-selected\" id=\"comment-0\" style=\"display: block;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-1\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-2\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-3\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-4\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><\/div><div id=\"detail-service\"><div><img alt=\"\" src=\"//img11.360buyimg.com/da/jfs/t2488/178/1184200744/155701/53df7244/568226a5N855beb86.jpg\" class=\"\" width=\"1010\"/><\/div><div>此店铺为京东全球购自营店铺。此店铺销售并发货的商品由京东提供售后服务，请您放心购买！ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \t<br/>\r\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\t注：因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件，本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货！并且保证与当时市场上同样主流新品一致。若本商城没有及时更新，请大家谅解！<\/div><\/div><\/div>","goods_price":"388.00","type_id":"39","parent_id":"33","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94du33f1f60pjhntlbm0ns2e.jpg","surplus":388}]}
     */

    private String message;
    private String status;
    /**
     * page :
     * list : [{"goods_id":"8","expect":"58","goods_status":"1","open_time":"1458040085","id":"8","goods_name":"MySQL技术内幕：InnoDB存储引擎（第2版）","goods_expect":"国内外数据库专家联袂推荐，基于MySQL 5.6，从存储引擎内核角度对InnoDB的核心实现和工作机制进行深入剖析","cover_img":["o_1a94u9g85u13o66mlje6jf3qd.jpg","o_1a94u9g85q5a1chn70b2b3ccve.jpg","o_1a94u9g85ltf4ug1us01skl56sf.jpg","o_1a94u9g86bpsa722q11evbh33g.jpg"],"goods_info":"<div id=\"detail-tag-id-2\" name=\"detail-tag-id-2\" text=\"编辑推荐\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|bianjituijianqu_3\"><div class=\"item-mt\"><h3>编辑推荐<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　畅销书全新升级，第1版广获好评；资深MySQL专家撰写，全球知名MySQL数据库服务提供商Percona公司CTO作序推荐，国内多位数据库专家联袂推荐<br/>　　基于MySQL 5.6，结合源代码，从存储引擎内核角度对InnoDB的整体架构、核心实现和工作机制进行深入剖析<\/p><p><br/><\/p><p><strong><span style=\"font-size: 12px;color: rgb(102, 102, 102)\">更多精彩，点击进入品牌店查阅&gt;&gt;<\/span><\/strong><\/p><p><a href=\"http://mall.jd.com/view_page-27025526.html\" target=\"_blank\"><img class=\"\" src=\"//img30.360buyimg.com/vc/jfs/t2026/38/1749253666/89958/8f2dcc57/56724e61N00307fa1.jpg\" style=\"\" data-lazyload=\"done\" title=\"750-110.jpg\"/><\/a><\/p><\/div><\/div><\/div><div id=\"detail-tag-id-3\" name=\"detail-tag-id-3\" text=\"内容简介\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|neirongjianjiequ_3\"><div class=\"item-mt\"><h3>内容简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\">　　《MySQL技术内幕：InnoDB存储引擎》由国内资深MySQL专家亲自执笔，国内外多位数据库专家联袂推荐。作为国内一本关于InnoDB的专著，本书的第1版广受好评，第2版不仅针对全新的MySQL 5.6对相关内容进行了全面的补充，还根据广大读者的反馈意见对第1版中存在的不足进行了完善，全书大约重写了50％的内容。本书从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制，并给出了大量实践，能帮助你系统而深入地掌握InnoDB，更重要的是，它能为你设计管理高性能、高可用的数据库系统提供专业的指导。<br/>　　《MySQL技术内幕：InnoDB存储引擎》一共10章，首先宏观地介绍了MySQL的体系结构和各种常见的存储引擎以及它们之间的比较；接着以InnoDB的内部实现为切入点，逐一详细讲解了InnoDB存储引擎内部的各个功能模块的实现原理，包括InnoDB存储引擎的体系结构、内存中的数据结构、基于InnoDB存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份与恢复，以及InnoDB的性能调优等重要的知识；最后对InnoDB存储引擎源代码的编译和调试做了介绍，对大家阅读和理解InnoDB的源代码有重要的指导意义。<br/>　　本书适合所有希望构建和管理高性能、高可用性的MySQL数据库系统的开发者和DBA阅读。<br/><\/div><\/div><\/div><div id=\"detail-tag-id-4\" name=\"detail-tag-id-4\" text=\"作者简介\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|zuozhejianjiequ_3\"><div class=\"item-mt\"><h3>作者简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　姜承尧（David Jiang），资深MySQL数据库专家，擅长于数据库的故障诊断、性能调优、容灾处理、高可用和高扩展研究，同时一直致力于MySQL数据库底层实现原理的研究和探索。此外，对高性能数据库和数据仓库也有深刻而独到的理解。曾为MySQL编写了许多开源工具和性能扩展补丁，如广受好评的InnoDB引擎二级缓存项目。现任网易杭州研究院技术经理一职，负责MySQL数据库的内核开发，参与设计与开发MySQL数据库在网易云环境中的应用。曾担任久游网数据库工程部经理，曾领导并参与了多个大型核心数据库的设计、实施、管理和维护，实战经验非常丰富。活跃于开源数据库以及开源软件领域，是著名开源社区ChinaUnix MySQL版块的版主，热衷于与网友分享自己的心得和体会，深受社区欢迎。<br/>　　除本书外，他还撰写了《MySQL技术内幕：SQL编程》，是本书的姊妹篇，颇受好评。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-6\" name=\"detail-tag-id-6\" text=\"目录\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|muluqu_3\"><div class=\"item-mt\"><h3>目录<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\">推荐序<br/>前言<br/>第1章　MySQL体系结构和存储引擎<br/>1.1　定义数据库和实例<br/>1.2　MySQL体系结构<br/>1.3　MySQL存储引擎<br/>1.3.1　InnoDB存储引擎<br/>1.3.2　MyISAM存储引擎<br/>1.3.3　NDB存储引擎<br/>1.3.4　Memory存储引擎<br/>1.3.5　Archive存储引擎<br/>1.3.6　Federated存储引擎<br/>1.3.7　Maria存储引擎<br/>1.3.8　其他存储引擎<br/>1.4　各存储引擎之间的比较<br/>1.5　连接MySQL<br/>1.5.1　TCP/IP<br/>1.5.2　命名管道和共享内存<br/>1.5.3　UNIX域套接字<br/>1.6　小结<br/>第2章　InnoDB存储引擎<br/>2.1　InnoDB存储引擎概述<br/>2.2　InnoDB存储引擎的版本<br/>2.3　InnoDB体系架构<br/>2.3.1　后台线程<br/>2.3.2　内存<br/>2.4　Checkpoint技术<br/>2.5　Master Thread工作方式<br/>2.5.1　InnoDB 1.0.x版本之前的Master Thread<br/>2.5.2　InnoDB1.2.x版本之前的Master Thread<br/>2.5.3　InnoDB1.2.x版本的Master Thread<br/>2.6　InnoDB关键特性<br/>2.6.1　插入缓冲<br/>2.6.2　两次写<br/>2.6.3　自适应哈希索引<br/>2.6.4　异步IO<br/>2.6.5　刷新邻接页<br/>2.7　启动、关闭与恢复<br/>2.8　小结<br/>第3章　文件<br/>3.1　参数文件<br/>3.1.1　什么是参数<br/>3.1.2　参数类型<br/>3.2　日志文件<br/>3.2.1　错误日志<br/>3.2.2　慢查询日志<br/>3.2.3　查询日志<br/>3.2.4　二进制日志<br/>3.3　套接字文件<br/>3.4　pid文件<br/>3.5　表结构定义文件<br/>3.6　InnoDB存储引擎文件<br/>3.6.1　表空间文件<br/>3.6.2　重做日志文件<br/>3.7　小结<br/>第4章　表<br/>4.1　索引组织表<br/>4.2　InnoDB逻辑存储结构<br/>4.2.1　表空间<br/>4.2.2　段<br/>4.2.3　区<br/>4.2.4　页<br/>4.2.5　行<br/>4.3　InnoDB行记录格式<br/>4.3.1　Compact行记录格式<br/>4.3.2　Redundant行记录格式<br/>4.3.3　行溢出数据<br/>4.3.4　Compressed和Dynamic行记录格式<br/>4.3.5　CHAR的行结构存储<br/>4.4　InnoDB数据页结构<br/>4.4.1　File Header<br/>4.4.2　Page Header<br/>4.4.3　Infimum和Supremum Records<br/>4.4.4　User Records和Free Space<br/>4.4.5　Page Directory<br/>4.4.6　File Trailer<br/>4.4.7　InnoDB数据页结构示例分析<br/>4.5　Named File Formats机制<br/>4.6　约束<br/>4.6.1　数据完整性<br/>4.6.2　约束的创建和查找<br/>4.6.3　约束和索引的区别<br/>4.6.4　对错误数据的约束<br/>4.6.5　ENUM和SET约束<br/>4.6.6　触发器与约束<br/>4.6.7　外键约束<br/>4.7　视图<br/>4.7.1　视图的作用<br/>4.7.2　物化视图<br/>4.8　分区表<br/>4.8.1　分区概述<br/>4.8.2　分区类型<br/>4.8.3　子分区<br/>4.8.4　分区中的NULL值<br/>4.8.5　分区和性能<br/>4.8.6　在表和分区间交换数据<br/>4.9　小结<br/>第5章　索引与算法<br/>5.1　InnoDB存储引擎索引概述<br/>5.2　数据结构与算法<br/>5.2.1　二分查找法<br/>5.2.2　二叉查找树和平衡二叉树<br/>5.3　B+树<br/>5.3.1　B+树的插入操作<br/>5.3.2　B+树的删除操作<br/>5.4　B+树索引<br/>5.4.1　聚集索引<br/>5.4.2　辅助索引<br/>5.4.3　B+树索引的分裂<br/>5.4.4　B+树索引的管理<br/>5.5　Cardinality值<br/>5.5.1　什么是Cardinality<br/>5.5.2　InnoDB存储引擎的Cardinality统计<br/>5.6　B+树索引的使用<br/>5.6.1　不同应用中B+树索引的使用<br/>5.6.2　联合索引<br/>5.6.3　覆盖索引<br/>5.6.4　优化器选择不使用索引的情况<br/>5.6.5　索引提示<br/>5.6.6　Multi-Range Read优化<br/>5.6.7　Index Condition Pushdown（ICP）优化<br/>5.7　哈希算法<br/>5.7.1　哈希表<br/>5.7.2　InnoDB存储引擎中的哈希算法<br/>5.7.3　自适应哈希索引<br/>5.8　全文检索<br/>5.8.1　概述<br/>5.8.2　倒排索引<br/>5.8.3　InnoDB全文检索<br/>5.8.4　全文检索<br/>5.9　小结<br/>第6章　锁<br/>6.1　什么是锁<br/>6.2　lock与latch<br/>6.3　InnoDB存储引擎中的锁<br/>6.3.1　锁的类型<br/>6.3.2　一致性非锁定读<br/>6.3.3　一致性锁定读<br/>6.3.4　自增长与锁<br/>6.3.5　外键和锁<br/>6.4　锁的算法<br/>6.4.1　行锁的3种算法<br/>6.4.2　解决Phantom Problem<br/>6.5　锁问题<br/>6.5.1　脏读<br/>6.5.2　不可重复读<br/>6.5.3　丢失更新<br/>6.6　阻塞<br/>6.7　死锁<br/>6.7.1　死锁的概念<br/>6.7.2　死锁概率<br/>6.7.3　死锁的示例<br/>6.8　锁升级<br/>6.9　小结<br/>第7章　事务<br/>7.1　认识事务<br/>7.1.1　概述<br/>7.1.2　分类<br/>7.2　事务的实现<br/>7.2.1　redo<br/>7.2.2　undo<br/>7.2.3　purge<br/>7.2.4　group commit<br/>7.3　事务控制语句<br/>7.4　隐式提交的SQL语句<br/>7.5　对于事务操作的统计<br/>7.6　事务的隔离级别<br/>7.7　分布式事务<br/>7.7.1　MySQL数据库分布式事务<br/>7.7.2　内部XA事务<br/>7.8　不好的事务习惯<br/>7.8.1　在循环中提交<br/>7.8.2　使用自动提交<br/>7.8.3　使用自动回滚<br/>7.9　长事务<br/>7.10　小结<br/>第8章　备份与恢复<br/>8.1　备份与恢复概述<br/>8.2　冷备<br/>8.3　逻辑备份<br/>8.3.1　mysqldump<br/>8.3.2　SELECT...INTO OUTFILE<br/>8.3.3　逻辑备份的恢复<br/>8.3.4　LOAD DATA INFILE<br/>8.3.5　mysqlimport<br/>8.4　二进制日志备份与恢复<br/>8.5　热备<br/>8.5.1　ibbackup<br/>8.5.2　XtraBackup<br/>8.5.3　XtraBackup实现增量备份<br/>8.6　快照备份<br/>8.7　复制<br/>8.7.1　复制的工作原理<br/>8.7.2　快照+复制的备份架构<br/>8.8　小结<br/>第9章　性能调优<br/>9.1　选择合适的CPU<br/>9.2　内存的重要性<br/>9.3　硬盘对数据库性能的影响<br/>9.3.1　传统机械硬盘<br/>9.3.2　固态硬盘<br/>9.4　合理地设置RAID<br/>9.4.1　RAID类型<br/>9.4.2　RAID Write Back功能<br/>9.4.3　RAID配置工具<br/>9.5　操作系统的选择<br/>9.6　不同的文件系统对数据库性能的影响<br/>9.7　选择合适的基准测试工具<br/>9.7.1　sysbench<br/>9.7.2　mysql-tpcc<br/>9.8　小结<br/>第10章　InnoDB存储引擎源代码的编译和调试<br/>10.1　获取InnoDB存储引擎源代码<br/>10.2　InnoDB源代码结构<br/>10.3　MySQL 5.1版本编译和调试InnoDB源代码<br/>10.3.1　Windows下的调试<br/>10.3.2　Linux下的调试<br/>10.4　cmake方式编译和调试InnoDB存储引擎<br/>10.5　小结<\/div><\/div><div class=\"more\"><a data-open=\"1\" href=\"http://#detail-tag-id-6\" clstag=\"shangpin|keycount|product|muluquanbu_3\">收起全部↑<\/a><\/div><\/div><div id=\"detail-tag-id-8\" name=\"detail-tag-id-8\" text=\"前言/序言\" class=\"book-detail-item\" clstag=\"shangpin|keycount|product|qianyanqu_3\"><div class=\"item-mt\"><h3>前言/序言<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\">　　为什么要写这本书<br/>　　过去这些年我一直在和各种不同的数据库打交道，见证了MySQL从一个小型的关系型数据库发展为各大企业的核心数据库系统的过程，并且参与了一些大大小小的项目的开发工作，成功地帮助开发人员构建了可靠的、健壮的应用程序。在这个过程中积累了一些经验，正是这些不断累积的经验赋予了我灵感，于是有了这本书。这本书实际上反映了这些年来我做了哪些事情，其中汇集了很多同行每天可能都会遇到的一些问题，并给出了解决方案。<br/>　　MySQL数据库独有的插件式存储引擎架构使其和其他任何数据库都不同。不同的存储引擎有着完全不同的功能，而InnoDB存储引擎的存在使得MySQL跃入了企业级数据库领域。本书完整地讲解了InnoDB存储引擎中最重要的一些内容，即InnoDB的体系结构和工作原理，并结合InnoDB的源代码讲解了它的内部实现机制。<br/>　　本书不仅讲述了InnoDB存储引擎的诸多功能和特性，还阐述了如何正确地使用这些功能和特性，更重要的是，还尝试了教我们如何Think Different。Think Different是20世纪90年代苹果公司在其旷日持久的宣传活动中提出的一个口号，借此来重振公司的品牌，更重要的是，这个口号改变了人们对技术在日常生活中的作用的看法。需要注意的是，苹果的口号不是Think Differently，是Think Different，Different在这里做名词，意味该思考些什么。<br/>　　很多DBA和开发人员都相信某些\u201c神话\u201d，然而这些\u201c神话\u201d往往都是错误的。无论计算机技术发展的速度变得多快，数据库的使用变得多么简单，任何时候Why都比What重要。只有真正理解了内部实现原理、体系结构，才能更好地去使用。这正是人类正确思考问题的原则。因此，对于当前出现的技术，尽管学习其应用很重要，但更重要的是，应当正确地理解和使用这些技术。<br/>　　关于本书，我的头脑里有很多个目标，但最重要的是想告诉大家如下几个简单的观点：<br/>　　·不要相信任何的\u201c神话\u201d，学会自己思考；<br/>　　·不要墨守成规，大部分人都知道的事情可能是错误的；<br/>　　·不要相信网上的传言，去测试，根据自己的实践做出决定；<br/>　　·花时间充分地思考，敢于提出质疑。<br/>　　当前有关MySQL的书籍大部分都集中在教读者如何使用MySQL，例如SQL语句的使用、复制的搭建的、数据的切分等。没错，这对快速掌握和使用MySQL数据库非常有好处，但是真正的数据库工作者需要了解的不仅仅是应用，更多的是内部的具体实现。<br/>　　MySQL数据库独有的插件式存储引擎使得想要在一本书内完整地讲解各个存储引擎变得十分困难，有的书可能偏重对MyISAM的介绍，有的可能偏重对InnoDB存储引擎的介绍。对于初级的DBA来说，这可能会使他们的理解变得更困难。对于大多数MySQL DBA和开发人员来说，他们往往更希望了解作为MySQL企业级数据库应用的第一存储引擎的InnoDB，我想在本书中，他们完全可以找到他们希望了解的内容。<br/>　　再强调一遍，任何时候Why都比What重要，本书从源代码的角度对InnoDB的存储引擎的整个体系架构的各个组成部分进行了系统的分析和讲解，剖析了InnoDB存储引擎的核心实现和工作机制，相信这在其他书中是很难找到的。<br/>　　第1版与第2版的区别<br/>　　本书是第2版，在写作中吸收了读者对上一版内容的许多意见和建议，同时对于最新MySQL 5.6中许多关于InnoDB存储引擎的部分进行了详细的解析与介绍。希望通过这些改进，给读者一个从应用到设计再到实现的完整理解，弥补上一版中深度有余，内容层次不够丰富、分析手法单一等诸多不足。<br/>　　较第1版而言，第2版的改动非常大，基本上重写了50%的内容。其主要体现在以下几个方面，希望读者能够在阅读中体会到。<br/>　　·本书增加了对最新MySQL 5.6中的InnoDB存储引擎特性的介绍。MySQL 5.6版本是有史以来最大的一次更新，InnoDB存储引擎更是添加了许多功能，如多线程清理线程、全文索引、在线索引添加、独立回滚段、非递归死锁检测、新的刷新算法、新的元数据表等。读者通过本书可以知道如何使用这些特性、新特性存在的局限性，并明白新功能与老版本InnoDB存储引擎之间实现的区别，从而在实际应用中充分利用这些特性。<br/>　　·根据读者的要求对于InnoDB存储引擎的redo日志和undo日志进行了详细的分析。读者应该能更好地理解InnoDB存储引擎事务的实现。在undo日志分析中，通过InnoSQL自带的元数据表，用户终于可对undo日志进行统计和分析，极大提高了DBA对于InnoDB存储引擎内部的认知。<br/>　　·对第6章进行大幅度的重写，读者可以更好地理解InnoDB存储引擎特有的next-key locking算法，并且通过分析锁的实现来了解死锁可能产生的情况，以及InnoDB存储引擎内部是如何来避免死锁问题的产生的。<br/>　　·根据读者的反馈，对InnoDB存储引擎的insert buffer模块实现进行了更为详细的介绍，读者可以了解其使用方法以及其内部的实现原理。此外还增加了对insert buffer的升级版本功能\u2014\u2014change buffer的介绍。<br/>　　读者对象<br/>　　本书不是一本面向应用的数据库类书籍，也不是一本参考手册，更不会教你如何在MySQL中使用SQL语句。本书面向那些使用MySQL InnoDB存储引擎作为数据库后端开发应用程序的开发者和有一定经验的MySQL DBA。书中的大部分例子都是用SQL语句来展示关键特性的，如果想通过本书来了解如何启动MySQL、如何配置Replication环境，可能并不能如愿。不过，在本书中，你将知道InnoDB存储引擎是如何工作的，它的关键特性的功能和作用是什么，以及如何正确配置和使用这些特性。<br/>　　如果你想更好地使用InnoDB存储引擎，如果你想让你的数据库应用获得更好的性能，就请阅读本书。从某种程度上讲，技术经理或总监也要非常了解数据库，要知道数据库对于企业的重要性。如果技术经理或总监想安排员工参加MySQL数据库技术方面的培训，完全可以利用本书来\u201c充电\u201d，相信你一定不会失望的。<br/>　　要想更好地学习本书的内容，要求具备以下条件：<br/>　　·掌握SQL。<br/>　　·掌握基本的MySQL操作。<br/>　　·接触过一些高级语言，如C、C++、Python或Java。<br/>　　·对一些基本算法有所了解，因为本书会分析InnoDB存储引擎的部分源代码，如果你能看懂这些算法，这会对你的理解非常有帮助。<br/>　　如何阅读本书<br/>　　本书一共有10章，每一章都像一本\u201c迷你书\u201d，可以单独成册，也就说你完全可以从书中任何一章开始阅读。例如，要了解第10章中的InnoDB源代码编译和调试的知识，就不必先去阅读第3章有关文件的知识。当然，如果你不太确定自己是否已经对本书所涉及的内容完全掌握了，建议你系统性地阅读本书。<br/>　　本书不是一本入门书籍，不会一步步引导你去如何操作。倘若你尚不了解InnoDB存储引擎，本书对你来说可能就显得沉重一些，建议你先查阅官方的API文档，大致掌握InnoDB的基础知识，然后再来学习本书，相信你会领略到不同的风景。<br/>　　为了便于大家阅读，本书在提供源代码下载的同时也将源代码附在了书中，因此占去了一些篇幅，还请大家理解。<br/>　　致谢<br/>　　在编写本书的过程中，我得到了很多朋友的热心帮助。首先要感谢Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko，通过和他们的不断交流，使我对InnoDB存储引擎有了更进一步的了解，同时知道了怎样才能正确地将InnoDB存储引擎的补丁应用到生产环境。<br/>　　其次，要感谢网易公司的各位同事们，能在才华横溢、充满创意的团队中工作我感到非常荣幸和兴奋。也因为在这个开放的工作环境中，我可以不断进行研究和创新。<br/>　　此外，我还要感谢我的母亲，写本书不是一件容易的事，特别是这本书还想传达一些思想，在这个过程中我遇到了很多的困难，感谢她在这个过程中给予我的支持和鼓励。<br/>　　最后，一份特别的感谢要送给本书的策划编辑杨福川和姜影，他们使得本书变得生动和更具有灵魂。此外还要感谢出版社的其他默默工作的同事们。<br/>　　姜承尧<\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-8\" clstag=\"shangpin|keycount|product|qianyanquanbu_3\">查看全部↓<\/a><\/div><\/div><p><br/><\/p>","goods_price":"100.00","type_id":"61","parent_id":"60","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94u9g85u13o66mlje6jf3qd.jpg","surplus":100},{"goods_id":"7","expect":"38","goods_status":"1","open_time":"1458040121","id":"7","goods_name":"PHP和MySQL Web开发（原书第4版）  [PHP a","goods_expect":"PHP和 MySQL Web 开发\u201c圣经\u201d 持续4版畅销","cover_img":["o_1a94phnab116hmid1i2hg5a16ttc.jpg","o_1a94phnabjbkf2ne171qmj1fucd.jpg","o_1a94phnab18cv1s7l1k5udfk1a9le.jpg"],"goods_info":"<div id=\"detail-tag-id-2\" name=\"detail-tag-id-2\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>编辑推荐<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p><span style=\"font-size:12px;\">　　PHP和MySQL Web开发\u201c圣经\u201d<br/>　　持续4版畅销<br/>　　PHP和MySQL是非常流行的开源技术，它们非常适合快速开发数据库驱动的Web应用。PHP是一种功能强大的脚本语言，专门用于快速创建高性能的Web应用，而MySQL则是一个快速而又可靠的数据库，它能很好地与PHP集成，适用于基于互联网的动态应用。<br/>　　本书介绍了如何使用这些工具创建高效和交互式的Web应用。它清晰地介绍了PHP语言的基础，解释了如何设置和使用MySQL数据，以及如何使用PHP与数据库和服务器进行交互。<br/>　　本书非常实用，包括大量实际应用中的例子。例如，用户验证、创建购物车、动态生成PDF文档和图像、发送和管理电子邮件、管理用户讨论、使用XML连接Web服务，以及使用基于Ajax的交互性开发Web 2.0应用。<br/>　　与上一版相比，本书经过了更新、重写以及扩展，并涵盖了PHP 5到5.3的所有特性，例如命名空间和闭包以及MySQL 5.1引入的特性。<\/span><strong><span style=\"font-size:12px;\"><br/><br/>更多精彩，点击进入品牌店查阅&gt;&gt;<br/><\/span><\/strong><\/p><p><a href=\"http://mall.jd.com/view_page-27025526.html\" target=\"_blank\"><img class=\"\" src=\"http://img30.360buyimg.com/vc/jfs/t1864/182/1049838360/89958/8f2dcc57/56678e7dN390a2c8c.jpg\" style=\"\" data-lazyload=\"done\" title=\"750-110.jpg\" alt=\"\"/><\/a><\/p><\/div><\/div><\/div><div id=\"detail-tag-id-3\" name=\"detail-tag-id-3\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>内容简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p>　　《PHP和MySQL Web开发（原书第4版）》将PHP开发与MySQL应用相结合，分别对PHP和MySQL做了深入浅出的分析，不仅介绍PHP和MySQL的一般概念，而且对PHP和MySQL的Web应用做了较全面的阐述，并包括几个经典且实用的例子。<br/>　　《PHP和MySQL Web开发（原书第4版）》是第4版，经过了全面的更新、重写和扩展，包括PHP 5.3改进的特性（例如，更好的错误和异常处理），MySQL的存储过程和存储引擎，Ajax技术与Web 2.0以及Web应用需要注意的安全问题。<br/>　　PHP平IEIMySQL是非常流行的开源技术，它们非常适合快速开发数据库驱动的Web应用。PHP是一种功能强大的脚本语言，专门用于快速创建高性能的Web应用，而MySQL则是一个快速而又可靠的数据库，它能很好地与PHP集成，适用于基于互联网的动态应用。<br/>　　《PHP和MySQL Web开发（原书第4版）》介绍了如何使用这些工具创建高效和交互式的Web应用。它清晰地介绍了PHP语言的基础，解释了如何设置和使用MySQL数据，以及如何使用PHP与数据库和服务器进行交互。<br/>　　《PHP和MySQL Web开发（原书第4版）》非常实用，包括大量实际应用中的例子。例如，用户验证、创建购物车、动态生成PDF文档和图像、发送和管理电子邮件、管理用户讨论、使用XML连接Web服务，以及使用基于Ajax的交互性开发Web 2.0应用。<br/>　　与上一版相比，本书经过了更新、重写以及扩展，并涵盖了PHP 5到5.3的所有特性，例如命名空间和闭包以及MySQL 5.1引入的特性。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-4\" name=\"detail-tag-id-4\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>作者简介<\/h3><\/div><div class=\"item-mc\"><div class=\"book-detail-content\"><p><strong>　　Laura Thomson，<\/strong>Mozilla\r\n公司的高级软件工程师。之前，她是OmniTI公司和Tangled Web \r\nDesign公司的合伙人。此外，Laura曾经在RMIT大学和波士顿顾问集团工作过。她获得了应用科学（计算机科学）的学士学位和工程学（计算机系统\r\n工程）学士学位。在她的空闲时间，她非常喜欢骑马，讨论免费软件和开源软件以及睡觉。<\/p><p><br/><strong>　　Luke Welling，<\/strong>OmniTI\r\n公司的一位Web架构师，他经常在一些国际会议（例如，OSCON，ZendCon，MySQLUC，HPCon，OSDC以及LinuxTag）中就开\r\n源和Web开发的话题发表演讲。在加入OmniTI公司之前，他曾作为数据库提供商的Web分析师为Hitwise.com公司工作。此外，他还是\r\nTangled Web \r\nDesign公司的独立顾问。他还在澳大利亚墨尔本的RMIT大学教授计算机科学课程。他获得了应用科学（计算机科学）的学士学位。在他的空闲时间，他希\r\n望治好他的失眠症。<\/p><p><br/><strong>　　其他参与者：<br/><br/>　　Julie C. Meloni，<\/strong>i2i\r\n Interactive 公司的技术总监，这是一家位于加利弗里亚Los Altos的多媒体公司。她从Web一问世以及出现GUI \r\nWeb浏览器时就致力于基于Web的应用开发。她编著过大量书籍，撰写过大量关于Web开发语言和数据的问题，其中包括销售情况良好的《Sams \r\nTeach Yourself PHP，MySQL, and Apache All in One》。<\/p><p><br/><strong>　　Adam DeFields，<\/strong>Web\r\n应用开发方面，项目管理以及UI设计方面的顾问。他居住在密歇根的Grand Rapids。在这个城市，有他自己的公司Emanation \r\nSystems，LLC，这是一家在2002年成立的公司。他参加过使用不同技术实现的Web开发项目，但是，他还是最喜欢开发基于PHP/MySQL的\r\n项目。<\/p><p><br/><strong>　　Marc Wandschneider，<\/strong>一个软件开发方面的自由职业者，此外他还是\r\n作家和演讲者，经常在全球范围参与有意思的项目开发。最近，他的注意力集中在编写健壮和可扩展的Web应用。在2005年，他编写了一本名为《Core \r\nWeb Application Programming with PHP and \r\nMySQL》的图书。此前，他是SWiK开源社区的主要开发人员。目前，Marc居住在北京，他将他的时间花在中文学习和编程。<\/p><\/div><\/div><\/div><div id=\"detail-tag-id-6\" name=\"detail-tag-id-6\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>目录<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\">读者反馈<br/>译者序<br/>前言<br/>作者简介<br/>第一篇 使用PHP<br/>第1章 PHP快速入门教程<br/>1.1 开始之前：了解PHP<br/>1.2 创建一个示例应用：Bob汽车零部件商店<br/>1.2.1 创建订单表单<br/>1.2.2 表单处理<br/>1.3 在HTML中嵌入PHP<br/>1.3.1 使用PHP标记<br/>1.3.2 PHP语句<br/>1.3.3 空格<br/>1.3.4 注释<br/>1.4 添加动态内容<br/>1.4.1 调用函数<br/>1.4.2 使用date()函数<br/>1.5 访问表单变量<br/>1.5.1 简短、中等以及长风格的表单变量<br/>1.5.2 字符串的连接<br/>1.5.3 变量和文本<br/>1.6 理解标识符<br/>1.7 检查变量类型<br/>1.7.1 PHP的数据类型<br/>1.7.2 类型强度<br/>1.7.3 类型转换<br/>1.7.4 可变变量<br/>1.8 声明和使用常量<br/>1.9 理解变量的作用域<br/>1.10 使用操作符<br/>1.10.1 算术操作符<br/>1.10.2 字符串操作符<br/>1.10.3 赋值操作符<br/>1.10.4 比较操作符<br/>1.10.5 逻辑操作符<br/>1.10.6 位操作符<br/>1.10.7 其他操作符<br/>1.11 &nbsp;计算表单总金额<br/>1.12 &nbsp;理解操作符的优先级和结合性：<br/>1.13 使用可变函数<br/>1.13.1 测试和设置变量类型<br/>1.13.2 测试变量状态<br/>1.13.3 变量的重解释<br/>1.14 根据条件进行决策<br/>1.14.1 if语句<br/>1.14.2 代码块<br/>1.14.3 else语句<br/>1.14.4 elseif语句<br/>1.14.5 switch语句<br/>1.14.6 比较不同的条件<br/>1.15 通过迭代实现重复动作<br/>1.15.1 while循环<br/>1.15.2 for和foreach循环<br/>1.15.3 do...while循环<br/>1.16 从控制结构或脚本中跳出<br/>1.17 使用可替换的控制结构语法<br/>1.18 使用declare<br/>1.19 下一章<br/><br/>第2章 数据的存储与检索<br/>2.1 保存数据以便后期使用<br/>2.2 存储和检索Bob的订单<br/>2.3 文件处理<br/>2.4 打开文件<br/>2.4.1 选择文件模式<br/>2.4.2 使用fopen()打开文件<br/>2.4.3 通过FTP或HTTP打开文件<br/>2.4.4 解决打开文件时可能遇到的问题<br/>2.5 写文件<br/>2.5.1 fwrite()的参数<br/>2.5.2 文件格式<br/>2.6 关闭文件<br/>2.7 读文件<br/>2.7.1 以只读模式打开文件：fopen()<br/>2.7.2 知道何时读完文件：feof()<br/>2.7.3 每次读取一行数据：fgets()、fgetss()和fgetcsv()<br/>2.7.4 读取整个文件：readfile()、fpassthru()和file()<br/>2.7.5 读取一个字符：fgetc()<br/>2.7.6 读取任意长度：fread()<br/>2.8 使用其他有用的文件函数<br/>2.8.1 查看文件是否存在：file_exists()<br/>2.8.2 确定文件大小：filesize()<br/>2.8.3 删除一个文件：unlink()<br/>2.8.4 在文件中定位：rewind()、fseek()和ftell()<br/>2.9 文件锁定<br/>2.10 更好的方式：数据库管理系统<br/>2.10.1 使用普通文件的几个问题<br/>2.10.2 &nbsp;RDBMS是如何解决这些问题的<br/>2.11 进一步学习<br/>2.12 下一章<br/><br/>第3章 使用数组<br/>3.1 什么是数组<br/>3.2 数字索引数组<br/>3.2.1 数字索引数组的初始化<br/>3.2.2 访问数组的内容<br/>3.2.3 使用循环访问数组<br/>3.3 使用不同索引的数组<br/>3.3.1 初始化相关数组<br/>3.3.2 访问数组元素<br/>3.3.3 使用循环语句<br/>3.4 数组操作符<br/>3.5 多维数组<br/>3.6 数组排序<br/>3.6.1 使用sort()函数<br/>3.6.2 使用asort()函数和ksort()函数对相关数组排序<br/>3.6.3 反向排序<br/>3.7 多维数组的排序<br/>3.7.1 用户定义排序<br/>3.7.2 反向用户排序<br/>3.8 对数组进行重新排序<br/>3.8.1 使用shuffle()函数<br/>3.8.2 使用array_reverse()函数<br/>3.9 从文件载入数组<br/>3.10 执行其他的数组操作<br/>3.10.1 在数组中浏览：each()、current()、reset()、end()、next()、pos()和prev()<br/>3.10.2 对数组的每一个元素应用任何函数：array_walk()<br/>3.10.3 统计数组元素个数：count()、sizeof()和array_count_values()<br/>3.10.4 将数组转换成标量变量：extract()<br/>3.11 进一步学习<br/>3.12 下一章<br/><br/>第4章 字符串操作与正则表达式<br/>4.1 创建一个示例应用程序：智能表单邮件<br/>4.2 字符串的格式化<br/>4.2.1 字符串的整理：chop()、ltrim()和trim()<br/>4.2.2 格式化字符串以便显示<br/>4.2.3 格式化字符串以便存储：addslashes()和stripslashes()<br/>4.3 用字符串函数连接和分割字符串<br/>4.3.1 使用函数explode()、implode()和join()<br/>4.3.2 使用strtok()函数<br/>4.3.3 使用substr()函数<br/>4.4 字符串的比较<br/>4.4.1 字符串的排序：strcmp()、strcasecmp()和strnatcmp()<br/>4.4.2 使用strlen()函数测试字符串的长度<br/>4.5 使用字符串函数匹配和替换子字符串<br/>4.5.1 在字符串中查找字符串：strstr()、strchr()、strrchr()和stristr()<br/>4.5.2 查找子字符串的位置：strpos()、strrpos()<br/>4.5.3 替换子字符串：str_replace()、substr_replace()<br/>4.6 正则表达式的介绍<br/>4.6.1 基础知识<br/>4.6.2 字符集和类<br/>4.6.3 重复<br/>4.6.4 子表达式<br/>4.6.5 子表达式计数<br/>4.6.6 定位到字符串的开始或末尾<br/>4.6.7 分支<br/>4.6.8 匹配特殊字符<br/>4.6.9 特殊字符一览<br/>4.6.10 在智能表单中应用<br/>4.7 用正则表达式查找子字符串<br/>4.8 使用正则表达式分割字符串<br/>4.9 比较字符串函数和正则表达式函数<br/>4.10 进一步学习<br/>4.11 下一章<br/><br/>第5章 代码重用与函数编写<br/>5.1 代码重用的好处<br/>5.1.1 成本<br/>5.1.2 可靠性<br/>5.1.3 一致性<br/>5.2 使用require()和include()函数<br/>5.2.1 文件扩展名和require()语句<br/>5.2.2 使用require()制作Web站点的模版<br/>5.2.3 使用auto_prepend_file和auto_append_file<br/>5.3 在PHP中使用函数<br/>5.3.1 调用函数<br/>5.3.2 调用未定义的函数<br/>5.3.3 理解字母大小写和函数名称<br/>5.4 理解为什么要定义自己的函数<br/>5.5 了解基本的函数结构<br/>5.5.1 函数命名<br/>5.6 使用参数<br/>5.7 理解作用域<br/>5.8 参数的引用传递和值传递<br/>5.9 &nbsp;使用Return关键字<br/>5.9.1 从函数返回一个值<br/>5.10 &nbsp;实现递归<br/>5.10.1 名称空间<br/>5.11 进一步学习<br/>5.12 下一章<br/><br/>第6章 面向对象的PHP<br/>6.1 理解面向对象的概念<br/>6.1.1 类和对象<br/>6.1.2 多态性<br/>6.1.3 继承<br/>6.2 在PHP中创建类、属性和操作<br/>6.2.1 类的结构<br/>6.2.2 构造函数<br/>6.2.3 析构函数<br/>6.3 类的实例化<br/>6.4 使用类的属性<br/>6.5 使用private和public关键字控制访问<br/>6.6 类操作的调用<br/>6.7 在PHP中实现继承<br/>6.7.1 通过继承使用private和protected访问修饰符控制可见性<br/>6.7.2 重载<br/>6.7.3 使用final关键字禁止继承和重载<br/>6.7.4 理解多重继承<br/>6.7.5 实现接口<br/>6.8 类的设计<br/>6.9 编写类代码<br/>6.10 理解PHP面向对象新的高级功能<br/>6.10.1 使用Per-Class常量<br/>6.10.2 实现静态方法<br/>6.10.3 检查类的类型和类型提示<br/>6.10.4 克隆对象<br/>6.10.5 使用抽象类<br/>6.10.6 使用__call()重载方法<br/>6.10.7 使用__autoload()方法<br/>6.10.8 实现迭代器和迭代<br/>6.10.9 将类转换成字符串<br/>6.10.10 使用Reflection（反射）API<br/>6.11 下一章<br/><br/>第7章 &nbsp;错误和 异常处理<br/>7.1 异常处理的概念<br/>7.2 Exception类<br/>7.3 用户自定义异常<br/>7.4 Bob的汽车零部件商店应用程序的异常<br/>7.5 异常和PHP的其他错误处理机制<br/>7.6 进一步学习<br/>7.7 下一章<br/><br/>第二篇 使用MySQL<br/>第8章 设计Web数据库<br/>8.1 关系数据库的概念<br/>8.1.1 表格<br/>8.1.2 列<br/>8.1.3 行<br/>8.1.4 值<br/>8.1.5 键<br/>8.1.6 模式<br/>8.1.7 关系<br/>8.2 如何设计Web数据库<br/>8.2.1 考虑要建模的实际对象<br/>8.2.2 避免保存冗余数据<br/>8.2.3 使用原子列值<br/>8.2.4 选择有意义的键<br/>8.2.5 考虑需要询问数据库的问题<br/>8.2.6 避免多个空属性的设计<br/>8.2.7 表格类型的总结<br/>8.3 Web数据库架构<br/>8.4 进一步学习<br/>8.5 下一章<br/><br/>第9章 创建Web数据库<br/>9.1 使用MySQL监视程序<br/>9.2 登录到MySQL<br/>9.3 创建数据库和用户<br/>9.4 设置用户与权限<br/>9.5 MySQL权限系统的介绍<br/>9.5.1 最少权限原则<br/>9.5.2 创建用户：GRANT命令<br/>9.5.3 权限的类型和级别<br/>9.5.4 REVOKE命令<br/>9.5.5 使用GRANT和REVOKE的例子<br/>9.6 创建一个Web用户<br/>9.7 使用正确的数据库<br/>9.8 创建数据库表<br/>9.8.1 理解其他关键字的意思<br/>9.8.2 理解列的类型<br/>9.8.3 用SHOW和DESCRIBE来查看数据库<br/>9.8.4 创建索引<br/>9.9 理解MySQL的标识符<br/>9.10 选择列数据类型<br/>9.10.1 数字类型<br/>9.10.2 日期和时间类型<br/>9.10.3 字符串类型<br/>9.11 进一步学习<br/>9.12 下一章<br/><br/>第10章 使用MySQL数据库<br/>10.1 SQL是什么<br/>10.2 在数据库中插入数据<br/>10.3 从数据库中获取数据<br/>10.3.1 获取满足特定条件的数据<br/>10.3.2 从多个表中获取数据<br/>10.3.3 以特定的顺序获取数据<br/>10.3.4 分组与合计数据<br/>10.3.5 选择要返回的行<br/>10.3.6 使用子查询<br/>10.4 更新数据库记录<br/>10.5 创建后修改表<br/>10.6 删除数据库中的记录<br/>10.7 表的删除<br/>10.8 删除整个数据库<br/>10.9 进一步学习<br/>10.10 下一章<br/><br/>第11章 使用PHP从Web访问MySQL数据库<br/>11.1 Web数据库架构的工作原理<br/>11.2 从Web查询数据库的基本步骤<br/>11.2.1 检查与过滤用户输入数据<br/>11.2.2 建立一个连接<br/>11.2.3 &nbsp;选择使用的数据库<br/>11.2.4 查询数据库<br/>11.2.5 检索查询结果<br/>11.2.6 从数据库断开连接<br/>11.3 将新信息放入数据库<br/>11.4 使用Prepared语句<br/>11.5 使用PHP与数据库交互的其他接口<br/>11.5.1 使用常规的数据库接口：PEAR MDB2<br/>11.6 进一步学习<br/>11.7 下一章<br/><br/>第12章 MySQL高级管理<br/>12.1 深入理解权限系统<br/>12.1.1 user表<br/>12.1.2 db表和host表<br/>12.1.3 tables_priv表，columns_priv表和procs_priv表<br/>12.1.4 访问控制：MySQL如何使用Grant表<br/>12.1.5 更新权限：修改什么时候生效<br/>12.2 提高MySQL数据库的安全性<br/>12.2.1 从操作系统角度来保护MySQL<br/>12.2.2 密码<br/>12.2.3 用户权限<br/>12.2.4 Web问题<br/>12.3 获取更多关于数据库的信息<br/>12.3.1 使用SHOW获取信息<br/>12.3.2 使用DESCRIBE获取关于列的信息<br/>12.3.3 用EXPLAIN理解查询操作的工作过程<br/>12.4 数据库的优化<br/>12.4.1 设计优化<br/>12.4.2 权限<br/>12.4.3 表的优化<br/>12.4.4 使用索引<br/>12.4.5 使用默认值<br/>12.4.6 其他技巧<br/>12.5 备份MySQL数据库<br/>12.6 恢复MySQL数据库<br/>12.7 实现复制<br/>12.7.1 设置主服务器<br/>12.7.2 执行初始的数据传输<br/>12.7.3 设置一个/多个从服务器<br/>12.8 进一步学习<br/>12.9 下一章<br/><br/>第13章 MySQL高级编程<br/>13.1 LOAD DATA INFILE语句<br/>13.2 存储引擎<br/>13.3 事务<br/>13.3.1 理解事务的定义<br/>13.3.2 通过InnoDB使用事务<br/>13.4 外键<br/>13.5 存储过程<br/>13.5.1 基本示例<br/>13.5.2 局部变量<br/>13.5.3 游标和控制结构<br/>13.6 进一步学习<br/>13.7 下一章<br/><br/>第三篇 电子商务与安全性<br/>第14章 运营一个电子商务网站<br/>14.1 我们要实现什么目标<br/>14.2 考虑电子商务网站的类型<br/>14.2.1 使用在线说明书公布信息<br/>14.2.2 接收产品或服务的订单<br/>14.2.3 提供服务和数字产品<br/>14.2.4 为产品或服务增值<br/>14.2.5 减少成本<br/>14.3 理解风险和威胁<br/>14.3.1 网络黑客<br/>14.3.2 不能招揽足够的生意<br/>14.3.3 计算机硬件故障<br/>14.3.4 电力、通信、网络或运输故障<br/>14.3.5 广泛的竞争<br/>14.3.6 软件错误<br/>14.3.7 不断变化的政府政策和税收<br/>14.3.8 系统容量限制<br/>14.4 选择一个策略<br/>14.5 下一章<br/><br/>第15章 电子商务的安全问题<br/>15.1 信息的重要程度<br/>15.2 安全威胁<br/>15.2.1 机密数据的泄露<br/>15.2.2 数据丢失和数据破坏<br/>15.2.3 数据修改<br/>15.2.4 拒绝服务<br/>15.2.5 软件错误<br/>15.2.6 否认<br/>15.3 易用性，性能、成本和安全性<br/>15.4 建立一个安全政策<br/>15.5 身份验证原则<br/>15.6 加密技术基础<br/>15.6.1 私有密钥加密<br/>15.6.2 &nbsp;公有密钥加密<br/>15.6.3 数字签名<br/>15.7 数字证书<br/>15.8 安全的Web服务器<br/>15.9 审计与日志记录<br/>15.10 防火墙<br/>15.11 备份数据<br/>15.11.1 备份常规文件<br/>15.11.2 备份与恢复MySQL数据库<br/>15.12 自然环境安全<br/>15.13 下一章<br/><br/>第16章 &nbsp;Web应用的安全<br/>16.1处理安全性问题的策略<br/>16.1.1 以正确心态为开始<br/>16.1.2 安全性和可用性之间的平衡<br/>16.1.3 安全监视<br/>16.1.4 基本方法<br/>16.2 识别所面临的威胁<br/>16.2.1 访问或修改敏感数据<br/>16.2.2 数据丢失或破坏<br/>16.2.3 拒绝服务<br/>16.2.4 恶意代码注入<br/>16.2.5 服务器被攻破<br/>16.3了解与我们\u201c打交道\u201d的用户<br/>16.3.1 破解人员<br/>16.3.2 受影响机器的未知情用户<br/>16.3.3 对公司不满的员工<br/>16.3.4 硬件被盗<br/>16.3.5 我们自身<br/>16.4 代码的安全性<br/>16.4.1 过滤用户输入<br/>16.4.2 转义输出<br/>16.4.3 代码组织<br/>16.4.4 代码自身的问题<br/>16.4.5 文件系统因素<br/>16.4.6 代码稳定性和缺陷<br/>16.4.7 执行引号和exec<br/>16.5 Web服务器和PHP的安全性<br/>16.5.1 保持软件的更新<br/>16.5.2 查看php.ini文件<br/>16.5.3 &nbsp;Web服务器配置<br/>16.5.4 Web应用的商业主机服务<br/>16.6 数据库服务器的安全性<br/>16.6.1 用户和权限系统<br/>16.6.2发送数据至服务器<br/>16.6.3 连接服务器<br/>16.6.4 运行服务器<br/>16.7 保护网络<br/>16.7.1 安装防火墙<br/>16.7.2使用隔离区域（DMZ）<br/>16.7.3应对DoS和DDoS攻击<br/>16.8 计算机和操作系统的安全性<br/>16.8.1 保持操作系统的更新<br/>16.8.2只运行必须的软件<br/>16.8.3 服务器的物理安全性<br/>16.9 灾难计划<br/>16.10 下一章<br/><br/>第17章 使用PHP和MySQL实现身份验证<br/>17.1 识别访问者<br/>17.2 实现访问控制<br/>17.2.1 保存密码<br/>17.2.2 密码的加密<br/>17.2.3 保护多个网页<br/>17.3 使用基本身份验证<br/>17.4 在PHP中使用基本身份验证<br/>17.5 在Apache的.htaccess文件中使用基本身份验证<br/>17.6 使用mod_auth_mysql身份验证<br/>17.6.1 安装mod_auth_mysql<br/>17.6.2 使用mod_auth_mysql<br/>17.7 创建自定义身份验证<br/>17.8 进一步学习<br/>17.9 下一章<br/><br/>第18章 使用PHP和MySQL实现安全事务<br/>18.1 提供安全的事务处理<br/>18.1.1 用户机器<br/>18.1.2 Internet<br/>18.1.3 我们的系统<br/>18.2 使用加密套接字层（SSL）<br/>18.3 屏蔽用户的输入<br/>18.4 提供安全存储<br/>18.5 存储信用卡号码<br/>18.6 在PHP中使用加密技术<br/>18.6.1 安装GPG<br/>18.6.2 测试GPG<br/>18.7 进一步学习<br/>18.8 下一章<br/><br/>第四篇 PHP的高级技术<br/>第19章 与文件系统和服务器的交互<br/>19.1 文件上载<br/>19.1.1 文件上载的HTML代码<br/>19.1.2 编写处理文件的PHP<br/>19.1.3 避免常见上载问题<br/>19.2 使用目录函数<br/>19.2.1 从目录读取<br/>19.2.2 获得当前目录的信息<br/>19.2.3 创建和删除目录<br/>19.3 与文件系统的交互<br/>19.3.1 获取文件信息<br/>19.3.2 更改文件属性<br/>19.3.3 创建、删除和移动文件<br/>19.4 使用程序执行函数<br/>19.5 与环境变量交互：getenv()和putenv()<br/>19.6 进一步学习<br/>19.7 下一章<br/><br/>第20章 使用网络函数和协议函数<br/>20.1 了解可供使用的协议<br/>20.2 发送和读取电子邮件<br/>20.3 使用其他Web站点的数据<br/>20.4 使用网络查找函数<br/>20.5 备份或镜像一个文件<br/>20.5.1 使用FTP备份或镜像一个文件<br/>20.5.2 上传文件<br/>20.5.3 避免超时<br/>20.5.4 使用其他的FTP函数<br/>20.6 进一步学习<br/>20.7 下一章<br/><br/>第21章 日期和时间的管理<br/>21.1 在PHP中获取日期和时间<br/>21.1.1 使用date()函数<br/>21.1.2 使用UNIX时间戳<br/>21.1.3 使用getdate()函数<br/>21.1.4 使用checkdate()函数检验日期有效性<br/>21.1.5 格式化时间戳<br/>21.2 在PHP日期格式和MySQL日期格式之间进行转换<br/>21.3 在PHP中计算日期<br/>21.4 在MySQL中计算日期<br/>21.5 使用微秒<br/>21.6 使用日历函数<br/>21.7 进一步学习<br/>21.8 下一章<br/><br/>第22章 创建图像<br/>22.1 在PHP中设置图像支持<br/>22.2 理解图像格式<br/>22.2.1 JPEG<br/>22.2.2 PNG<br/>22.2.3 WBMP<br/>22.2.4 GIF<br/>22.3 创建图像<br/>22.3.1 创建一个背景图像<br/>22.3.2 在图像上绘图或打印文本<br/>22.3.3 输出最终图形<br/>22.3.4 清理<br/>22.4 在其他页面中使用自动生成的图像<br/>22.5 使用文本和字体创建图像<br/>22.5.1 创建基本画布<br/>22.5.2 将文本调整到适合按钮<br/>22.5.3 放置文本<br/>22.5.4 将文本写到按钮上<br/>22.5.5 完成<br/>22.6 绘制图像与用图表描绘数据<br/>22.7 使用其他的图像函数<br/>22.8 进一步学习<br/>22.9 下一章<br/><br/>第23章 在PHP中使用会话控制<br/>23.1 什么是会话控制<br/>23.2 理解基本的会话功能<br/>23.2.1 什么是cookie<br/>23.2.2 通过PHP设置cookie<br/>23.2.3 在会话中使用cookie<br/>23.2.4 存储会话 ID<br/>23.3 实现简单的会话<br/>23.3.1 开始一个会话<br/>23.3.2 注册一个会话变量<br/>23.3.3 使用会话变量<br/>23.3.4 注销变量与销毁会话<br/>23.4 创建一个简单的会话例子<br/>23.5 配置会话控制<br/>23.6 通过会话控制实现身份验证<br/>23.7 进一步学习<br/>23.8 下一章<br/><br/>第24章 其他有用的特性<br/>24.1 使用eval()函数对字符串求值<br/>24.2 终止执行：die和exit<br/>24.3 序列化变量和对象<br/>24.4 获取PHP环境信息<br/>24.4.1 找到所加载的PHP扩展部件<br/>24.4.2 识别脚本所有者<br/>24.4.3 确定脚本最近修改时间<br/>24.5 暂时改变运行时环境<br/>24.6 源代码加亮<br/>24.7 在命令行中使用PHP<br/>24.8 下一章<br/><br/>第五篇 创建实用的PHP和MySQL项目<br/>第25章 在大型项目中使用PHP和MySQL<br/>25.1 在Web开发中应用软件工程<br/>25.2 规划和运行Web应用程序项目<br/>25.3 重用代码<br/>25.4 编写可维护代码<br/>25.4.1 编码标准<br/>25.4.2 分解代码<br/>25.4.3 使用标准的目录结构<br/>25.4.4 文档化和共享内部函数<br/>25.5 实现版本控制<br/>25.6 选择一个开发环境<br/>25.7 项目的文档化<br/>25.8 建立原型<br/>25.9 将逻辑和内容分离<br/>25.10 优化代码<br/>25.10.1 使用简单优化<br/>25.10.2 使用Zend产品<br/>25.11 测试<br/>25.12 进一步学习<br/>25.13 下一章<br/><br/>第26章 调试<br/>26.1 编程错误<br/>26.1.1 语法错误<br/>26.1.2 运行时错误<br/>26.1.3 逻辑错误<br/>26.2 使用变量帮助调试<br/>26.3 错误报告级别<br/>26.4 改变错误报告设置<br/>26.5 触发自定义错误<br/>26.6 巧妙地处理错误<br/>26.7 下一章<br/><br/>第27章 建立用户身份验证机制和个性化设置<br/>27.1 解决方案的组成<br/>27.1.1 用户识别和个性化设置<br/>27.1.2 保存书签<br/>27.1.3 推荐书签<br/>27.2 解决方案概述<br/>27.3 实现数据库<br/>27.4 实现基本的网站<br/>27.5 实现用户身份验证<br/>27.5.1 注册<br/>27.5.2 登录<br/>27.5.3 登出<br/>27.5.4 修改密码<br/>27.5.5 重设遗忘的密码<br/>27.6 实现书签的存储和检索<br/>27.6.1 添加书签<br/>27.6.2 显示书签<br/>27.6.3 删除书签<br/>27.7 实现书签推荐<br/>27.8 考虑可能的扩展<br/>27.9 下一章<br/><br/>第28章 创建一个购物车<br/>28.1 解决方案的组成<br/>28.1.1 创建一个在线目录<br/>28.1.2 在用户购买商品的时候记录购买行为<br/>28.1.3 实现一个付款系统<br/>28.1.4 创建一个管理界面<br/>28.2 解决方案概述<br/>28.3 实现数据库<br/>28.4 实现在线目录<br/>28.4.1 列出目录<br/>28.4.2 列出一个目录中的所有图书<br/>28.4.3 显示图书详细信息<br/>28.5 实现购物车<br/>28.5.1 使用show_cart.php脚本<br/>28.5.2 浏览购物车<br/>28.5.3 将物品添加到购物库<br/>28.5.4 保存更新后的购物车<br/>28.5.5 打印标题栏摘要<br/>28.5.6 结账<br/>28.6 实现付款<br/>28.7 实现一个管理界面<br/>28.8 扩展该项目<br/>28.9 使用一个已有系统<br/>28.10 下一章<br/><br/>第29章 创建一个基于Web的电子邮件服务系统<br/>29.1 解决方案的组成<br/>29.1.1 电子邮件协议：POP3和IMAP<br/>29.1.2 PHP对POP3和IMAP的支持<br/>29.2 解决方案概述<br/>29.3 建立数据库<br/>29.4 了解脚本架构<br/>29.5 登录与登出<br/>29.6 建立账户<br/>29.6.1 创建一个新账户<br/>29.6.2 修改已有账户<br/>29.6.3 删除账户<br/>29.7 阅读邮件<br/>29.7.1 选择账户<br/>29.7.2 查看邮箱内容<br/>29.7.3 阅读邮件消息<br/>29.7.4 查看消息标题<br/>29.7.5 删除邮件<br/>29.8 发送邮件<br/>29.8.1 发送一则新消息<br/>29.8.2 回复或转发邮件<br/>29.9 扩展这个项目<br/>29.10 下一章<br/><br/>第30章 创建一个邮件列表管理器<br/>30.1 解决方案的组成<br/>30.1.1 建立列表和订阅者数据库<br/>30.1.2 上载新闻信件<br/>30.1.3 发送带附件的邮件<br/>30.2 解决方案概述<br/>30.3 建立数据库<br/>30.4 定义脚本架构<br/>30.5 实现登录<br/>30.5.1 新账户的创建<br/>30.5.2 登录<br/>30.6 用户函数的实现<br/>30.6.1 查看列表<br/>30.6.2 查看邮件列表信息<br/>30.6.3 查看邮件列表存档<br/>30.6.4 订阅与取消订阅<br/>30.6.5 更改账户设置<br/>30.6.6 更改密码<br/>30.6.7 登出<br/>30.7 管理功能的实现<br/>30.7.1 创建新的邮件列表<br/>30.7.2 上载新的新闻信件<br/>30.7.3 多文件上载的处理<br/>30.7.4 预览新闻信件<br/>30.7.5 发送邮件<br/>30.8 扩展这个项目<br/>30.9 下一章<br/><br/>第31章 创建一个Web论坛<br/>31.1 理解流程<br/>31.2 解决方案的组成<br/>31.3 解决方案概述<br/>31.4 数据库的设计<br/>31.5 查看文章的树型结构<br/>31.5.1 展开和折叠<br/>31.5.2 显示文章<br/>31.5.3 使用treenode类<br/>31.6 查看单个的文章<br/>31.7 添加新文章<br/>31.8 添加扩充<br/>31.9 使用一个已有的系统<br/>31.10 下一章<br/><br/>第32章 生成PDF格式的个性化文档<br/>32.1 项目概述<br/>32.1.1 评估文档格式<br/>32.2 解决方案的组成<br/>32.2.1 问题与回答系统<br/>32.2.2 文档生成软件<br/>32.3 解决方案概述<br/>32.3.1 提问<br/>32.3.2 给答题评分<br/>32.3.3 生成RTF证书<br/>32.3.4 从模板生成PDF证书<br/>32.3.5 使用PDFlib生成PDF文档<br/>32.3.6 使用PDFlib的一个\u201cHello World\u201d程序<br/>32.3.7 用PDFlib生成证书<br/>32.4 处理标题的问题<br/>32.5 扩展该项目<br/>32.6 下一章<br/><br/>第33章 使用XML和SOAP来连接Web服务<br/>33.1 项目概述：使用XML和Web服务<br/>33.1.1 理解XML<br/>33.1.2 理解Web服务<br/>33.2 解决方案的组成<br/>33.2.1 使用Amazon的Web服务接口<br/>33.2.2 &nbsp;XML的解析：REST响应<br/>33.2.3 在PHP中使用SOAP<br/>33.2.4 缓存<br/>33.3 解决方案概述<br/>33.3.1 核心应用程序<br/>33.3.2 显示特定种类的图书<br/>33.3.3 获得一个AmazonResultSet类<br/>33.3.4 使用REST发送和接收请求<br/>33.3.5 使用SOAP发送和接收请求<br/>33.3.6 缓存请求返回的数据<br/>33.3.7 创建购物车<br/>33.3.8 到Amazon付账<br/>33.4 安装项目代码<br/>33.5 扩展这个项目<br/>33.6 进一步学习<br/><br/>第34 章使用Ajax构建Web 2.0应用<br/>34.1 Ajax 是什么？<br/>34.1.1 HTTP请求和响应<br/>34.1. 2 DHTML和XHTML<br/>34.1.3 级联样式单（CSS）<br/>34.1.4 客户端编程<br/>34.1.5 服务器端编程<br/>34.1.6 XML和XSLT<br/>34.2 Ajax基础<br/>34.2.1 XMLHTTPRequest对象<br/>34.2.2 与服务器通信<br/>34.2.3 处理服务器响应<br/>34.2.4 整合应用<br/>34.3 在以前的项目添加Ajax元素<br/>34.3.1在PHPBookmark应用中添加Ajax元素<br/>34.4 进一步学习<br/>34.4.1 进一步了解文档对象模型（DOM）<br/>34.4.2 Ajax应用可用的JavaScript函数库<br/>34.4.3 Ajax开发人员网站<br/><br/>第六篇 附录<br/>附录A 安装PHP及MySQL<br/>附录B Web资源<br/>第1章 PHP快速入门教程<br/>第2章 数据的存储与检索<br/>第3章 使用数组<br/>第4章 字符串操作与正则表达式<br/>第5章 代码重用与函数编写<br/>第6章 面向对象的PHP<br/>第7章 错误和异常处理<\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-6\">查看全部↓<\/a><\/div><\/div><div id=\"detail-tag-id-7\" name=\"detail-tag-id-7\" class=\"book-detail-item\"><div class=\"item-mt\"><h3>精彩书摘<\/h3><\/div><div class=\"item-mc\"><div style=\"height: 314px; overflow: hidden;\" class=\"book-detail-content\"><p>　　5.1 代码重用的好处<br/>　\r\n　软件工程师的一个目标就是通过重复使用代码来避免编写新的代码。这样做并不是因为他们懒，而是因为重新使用已有的代码可以降低成本、增加代码的可靠性并\r\n提高它们的一致性。在理想情况下，一个新的项目是这样创建的：它将已有的可重新利用的组件进行组合，并将新的开发难度降低到最小。<br/>　　5.1.1 成本<br/>　\r\n　在一个软件的有效生命周期中，相当多的时间是用在维护、修改、测试和文档化记录上，而不是最初花在编码上的时间。如果要编写商业代码，应该尽量限制结构\r\n中所用到的代码行数。一个最常使用的方法就是：重新使用已有的代码，而不是为一个新任务编写一个和原来代码只有微小区别的新代码。更少的代码意味着更低的\r\n成本。如果市场上已经存在能够满足需求的软件，那就购买软件。购买已有软件的成本总是要小于开发一个等价产品的成本。如果有现成的软件基本上能够满足要\r\n求，那就必须小心地使用它。修改已有的代码可能会比编写新代码更加困难。<br/>　　5.1.2 可靠性<br/>　　如果一个模块代码已经在代码结构中使\r\n用了，可以认为它是已经通过测试的。即使代码只有几行，在重写时仍然可能忽略两方面的内容，一是原作者融入其中的某些东西，二是代码测试发现缺陷后，对原\r\n来代码添加的一些东西。使用现存的成熟的代码通常要比新鲜的\u201c绿色\u201d代码更可靠。<br/>　　5.1.3 一致性<br/>　　系统的外部接口应该是一致的，其中包括用户接口和系统的外部接口。编写一段新的并且能够和系统函数的其他部分保持一致的代码需要花些心思和努力。如果重复使用运行在系统其他部分的代码，所实现的功能自然就会达到一致。<br/>　　除了这些优点外，只要原来的代码是模块化的而且编写良好，那么重复使用代码还会节省许多工作。在工作时，可以试着辨认一下今后可能再次要调用的代码段。<br/>　　5.2 使用require（）和include（）函数<br/>　\r\n　PHP提供了两个非常简单却很有用的语句，它们允许重新使用任何类型的代码。使用一条require（）或include（）语句，可以将一个文件载入\r\n到PHP脚本中。通常，这个文件可以包含任何希望在一个脚本中输入的内容，其中包括PHP语句、文本、HTML标记、PHP函数或PHP类。<br/>　　这些语句的工作方式类似于大多数Web服务器提供的服务器端包含方式以及C语言或C++中的#include语句。<br/>　　require（）和include（）几乎是相同的。二者唯一的区别在于函数失败后，require（）函数将给出一个致命的错误。而include（）只是给出一个警告。<br/>　\r\n　require（）和include（）也有两个变体函数，分别是require_once（）和include_once（）。正如你可能猜到的，这\r\n两个函数的作用是一个被引入（included）的文件只能被引入一次。对于我们已经介绍过的例子\u2014\u2014页眉和脚注（header and \r\nfooter）\u2014\u2014这个功能并不是非常有用。<br/>　　当使用require（）和include（）来引入函数库时，它们才非常有用。使用这两个函数可以防止错误的引入同样的函数库两次，从而出现重复定义的错误。如果关心编码实践，可以考虑使用require（）和include（），因为它们的运行速度较快。<br/>　　5.2.1 文件扩展名和require（）函数<br/>　　如下所示的代码保存于reusable.php文件中：<br/>　　如下所示的代码保存于main.php文件中：<br/>　　如果载入reusable.php，当浏览器中显示出\u201cHere is a very simple PHP statement\u201d时，你不会感到奇怪。如果载入main.php，则会发生一件更有趣的事情。该脚本输出结果如图5-1所示。<br/>　　当需要一个文件的时候，可以使用require（）语句。在前面的例子中，我们使用的文件是reusable.php。当运行该脚本时，require（）语句：<br/>　　将被请求的文件内容代替，然后再执行脚本。这就意味着，当载入main.php文件时，它会像如下所示的代码那样执行：<br/>　　当使用require（）语句时，必须注意处理文件扩展名和PHP标记的不同方式。<br/>　\r\n　PHP并不会查看所需文件的扩展名。这就意味着，只要不想直接调用这个文件，就可以任意命名该文件。当使用require（）语句载入文件时，它会作为\r\nPHP文件的一部分被执行。 \r\n通常，如果PHP语句放在一个HTML文件（例如，名为page.html的文件）中时，它们是不会被处理的。PHP通常用来解析扩展名被定义成\r\n如.php的文件。（在Web服务器配置文件中可能不是这样）但是，如果通过require（）语句载入这个page.html，文件内的任何PHP命令\r\n都会被处理。因此，可以使用任何扩展名来命名包含文件，但要尽量遵循一个约定，例如将扩展名命名为.inc是一个很好的办法。<br/>　　需要注意的一个\r\n问题是，如果扩展名为.inc或一些其他的非标准扩展名的文件保存在Web文档树中，而且用户可以在浏览器中直接载入它们，用户将可以以普通文本的形式查\r\n看源代码，包括任何密码。因此，将被包含文件保存在文档树之外，或使用标准的文件扩展名是非常重要的。<br/>　　提示：<br/>　　在这个例子中，可重用文件（reusable.php）代码如下所示：<br/>　　我们将文件中的PHP代码放到PHP标记之间。如果希望一个所需文件中的PHP代码能<br/>　　被当成PHP代码进行处理，就必须这样做。如果不使用PHP标记，代码将会被视为文本或者HTML脚本，因此也就不会被执行。<br/>　　5.2.2 使用require（）制作Web站点的模版<br/>　　如果Web页面具有一致的外观，可以在PHP中使用require（）语句将模版和标准元素加<br/>　　到页面中。<br/>　　例如，一个虚构的TLA咨询公司的网站有许多页面，这些页面的外观看上去都如图5-2所示。当需要一个新页面的时候，开发人员可以打开一个已有页面，从文件中间剪切所需的文本，输入所需的新文本，然后以新的文件名保存。<br/>　\r\n　考虑这种情况：网站已经存在了一段时间，如今已有数十个、数百个甚至数千个页面都是同一种风格。现在，要对标准外观进行部分修改\u2014这种修改可能是很微小\r\n的改变，例如，在每个脚注上加一个电子邮件地址，或者加上一个新的导航菜单入口。你希望对这数十个、数百个甚至数千个页面都做这种微小的修改吗？<br/>　　相对于剪切粘贴数十个、数百个甚至数千个页面，直接重用各个页面中通用的HTML代码部分是一个更好的办法。程序清单5-1给出了图5-2所示页面（home.html）的源代码。<br/>　　\u2026\u2026<\/p><\/div><\/div><div class=\"more\"><a data-open=\"0\" href=\"http://#detail-tag-id-7\">查看全部↓<\/a><\/div><\/div><p><br/><\/p><p><br/><\/p>","goods_price":"100.00","type_id":"61","parent_id":"60","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94phnab116hmid1i2hg5a16ttc.jpg","surplus":100},{"goods_id":"3","expect":"7","goods_status":"1","open_time":"1458040169","id":"3","goods_name":"【京东全球购自营】飞利浦（PHILIPS）电动剃须刀 三刀头","goods_expect":"【京东全球购自营】飞利浦（PHILIPS）电动剃须刀 三刀头干湿两用 AT755/16 AT755 ","cover_img":["o_1a94du33f1f60pjhntlbm0ns2e.jpg","o_1a94du33g1cj2l0h1lc5pa3151jf.jpg","o_1a94du33gsr5acq17hnkkq1rdug.jpg","o_1a94du33g15qo2b81iuhkv186fh.jpg","o_1a94du33gd551mq84vh1ql41e0hi.jpg"],"goods_info":"<div id=\"detail-content\" class=\"detail-content-wrap\" align=\"center\"><div clstag=\"shangpin|keycount|product|1|canshuqu\" class=\"parameter-content\" data-lazyload-fn=\"done\"><br/><div clstag=\"shangpin|keycount|product|pop-glbs\" id=\"J-detail-pop-tpl-top-new\"><img alt=\"\" usemap=\"#Map\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2137/144/2031912902/88246/213086aa/56972cf9Nc80150c7.jpg\" border=\"0\"/><map name=\"Map\"><area target=\"_blank\" href=\"http://item.jd.hk/1955631432.html\" coords=\"342,20,647,188\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954418220.html\" coords=\"665,23,963,187\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954417861.html\" coords=\"22,204,323,373\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954417136.html\" coords=\"342,202,648,371\" shape=\"rect\"/><area target=\"_blank\" href=\"http://item.jd.hk/1954416422.html\" coords=\"664,204,966,369\" shape=\"rect\"/><\/map><\/div><div id=\"J-detail-content\" data-lazyload-install=\"1\"><img id=\"619d73de6fe1427ea5e45dd3e5f055f3\" alt=\"\" data-lazyload=\"done\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2323/325/1740579904/196935/1ef6c65e/56777827Nc84db257.jpg\" class=\"\"/> <img id=\"6d35b70e8b7c44ceb2bba11e07e6d0c5\" alt=\"\" data-lazyload=\"done\" src=\"http://img30.360buyimg.com/popWareDetail/jfs/t2500/44/1737688308/105146/e0d8f5c3/566fce7bNcf287d1f.jpg\" class=\"\"/> <img alt=\"\" data-lazyload=\"done\" src=\"//img10.360buyimg.com/imgzone/jfs/t2485/278/1199470034/192964/65aff7ee/5684af7aNc1617c75.jpg\" class=\"\"/> <img alt=\"\" data-lazyload=\"done\" src=\"http://img20.360buyimg.com/vc/jfs/t2221/249/964649066/65455/44702c00/563de888Nd3ae0177.jpg\" class=\"\" height=\"460\" width=\"750\"/> <img alt=\"\" data-lazyload=\"done\" src=\"http://img10.360buyimg.com/imgzone/jfs/t2413/205/1509619481/129106/7be99bd3/5664efaeNafdd2e5a.jpg\" class=\"\" height=\"559\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2536/290/240701725/106577/df99bed1/563de889N6d7726b7.jpg\" height=\"624\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2500/83/1128973125/71257/6431561/563de88aN840601b3.jpg\" height=\"589\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2545/348/230255860/101636/1776dc9e/563de88aN971cd7b1.jpg\" height=\"704\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2026/60/1128984726/64149/48c529da/563de88bN73cbe631.jpg\" height=\"696\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1978/75/1133124045/87466/8bf9704e/563de88cNa9c0803b.jpg\" height=\"690\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2188/279/1038072393/77802/4ed993f6/563de88cNe609e546.jpg\" height=\"537\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2263/146/1093642381/68769/651af3/563de88dN596b0231.jpg\" height=\"557\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1900/262/1065771847/71543/f8e6703f/563de892N3bfdef72.jpg\" height=\"591\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2452/90/1091319484/92823/f03ac1e0/563de893N5d68c5e9.jpg\" height=\"643\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2497/268/1071493444/73800/eb2e1581/563de893Nd2d61f12.jpg\" height=\"524\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1927/100/1069692550/116675/e2c495ce/563de894N647360f7.jpg\" height=\"765\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2230/257/977610087/84365/eb22d823/563de894N2c18ed2f.jpg\" height=\"558\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1975/79/1113362032/102528/3b73c6f8/563de895N3700a649.jpg\" height=\"514\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t2227/262/987638780/102160/77963982/563de896N6cd26b86.jpg\" height=\"488\" width=\"750\"/> <img alt=\"\" data-lazyload=\"http://img20.360buyimg.com/vc/jfs/t1891/264/985337848/123734/bb3dee0/563de897Nfc2e9fed.jpg\" height=\"601\" width=\"750\"/> <img alt=\"\" data-lazyload=\"//img10.360buyimg.com/imgzone/jfs/t2185/247/1840756327/129162/e0ad837a/5683a74fNd432c84c.jpg\"/><br/><\/div><div clstag=\"shangpin|keycount|product|pop-glbs\" id=\"J-detail-pop-tpl-bottom-new\"><\/div><\/div><div id=\"detail-param\"><table class=\"Ptable\" border=\"0\" cellpadding=\"0\" cellspacing=\"1\" width=\"100%\"><tbody><tr><th colspan=\"2\" class=\"tdTitle\">主体<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">品牌<\/td><td>飞利浦 PHILIPS<\/td><\/tr><tr><td class=\"tdTitle\">类别<\/td><td>旋转式3刀头<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">电源<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">供电方式<\/td><td>充电式<\/td><\/tr><tr><td class=\"tdTitle\">操作时长<\/td><td>40 min<\/td><\/tr><tr><td class=\"tdTitle\">充电时长<\/td><td>8小时<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">刀头<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">刀片<\/td><td>双层<\/td><\/tr><tr><td class=\"tdTitle\">刀头水洗<\/td><td>支持<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">基本规格<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">产地<\/td><td>中国<\/td><\/tr><tr><td class=\"tdTitle\">全身水洗<\/td><td>支持<\/td><\/tr><tr><th colspan=\"2\" class=\"tdTitle\">特性<\/th><\/tr><tr><\/tr><tr><td class=\"tdTitle\">独特设计<\/td><td>胡茬储藏室<\/td><\/tr><tr><td class=\"tdTitle\">通用电压<\/td><td>支持<\/td><\/tr><\/tbody><\/table><\/div><div id=\"comment\"><div class=\"comment\"><div class=\"mc\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><\/div><\/div><div clstag=\"shangpin|keycount|product|comment\" data-widget=\"tabs\" class=\"m\" id=\"comments-list\" data-lazyload-fn=\"0\"><div class=\"mt\"><div class=\"mt-inner m-tab-trigger-wrap clearfix\"><ul class=\"m-tab-trigger\"><li clstag=\"shangpin|keycount|glbproduct|allpingjia\" class=\"ui-switchable-item trig-item curr\"><a href=\"http://javascript:;\">全部评价<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|haoping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">好评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|zhongping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">中评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|chaping\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">差评<em>()<\/em><\/a><\/li><li clstag=\"shangpin|keycount|glbproduct|shaidantab\" class=\"ui-switchable-item trig-item\"><a href=\"http://javascript:;\">有晒单的评价<em>()<\/em><\/a><\/li><\/ul><\/div><\/div><div class=\"ui-switchable-panel mc comments-table ui-switchable-panel-selected\" id=\"comment-0\" style=\"display: block;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-1\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-2\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-3\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><div class=\"ui-switchable-panel mc hide comments-table\" id=\"comment-4\" style=\"display: none;\"><div class=\"iloading\">正在加载中，请稍候...<\/div><\/div><\/div><div id=\"detail-service\"><div><img alt=\"\" src=\"//img11.360buyimg.com/da/jfs/t2488/178/1184200744/155701/53df7244/568226a5N855beb86.jpg\" class=\"\" width=\"1010\"/><\/div><div>此店铺为京东全球购自营店铺。此店铺销售并发货的商品由京东提供售后服务，请您放心购买！ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \t<br/>\r\n &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\t注：因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件，本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货！并且保证与当时市场上同样主流新品一致。若本商城没有及时更新，请大家谅解！<\/div><\/div><\/div>","goods_price":"388.00","type_id":"39","parent_id":"33","limit_buy_num":"0","auto_release":"y","is_down_line":"n","img_n":"http://rtxos.taoweikeji.com/Public/Uploads/o_1a94du33f1f60pjhntlbm0ns2e.jpg","surplus":388}]
     */

    private DataEntity data;

    public void setMessage(String message) {
        this.message = message;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setData(DataEntity data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public String getStatus() {
        return status;
    }

    public DataEntity getData() {
        return data;
    }

    public static class DataEntity {
        private String page;
        /**
         * goods_id : 8
         * expect : 58
         * goods_status : 1
         * open_time : 1458040085
         * id : 8
         * goods_name : MySQL技术内幕：InnoDB存储引擎（第2版）
         * goods_expect : 国内外数据库专家联袂推荐，基于MySQL 5.6，从存储引擎内核角度对InnoDB的核心实现和工作机制进行深入剖析
         * cover_img : ["o_1a94u9g85u13o66mlje6jf3qd.jpg","o_1a94u9g85q5a1chn70b2b3ccve.jpg","o_1a94u9g85ltf4ug1us01skl56sf.jpg","o_1a94u9g86bpsa722q11evbh33g.jpg"]
         * goods_info : <div id="detail-tag-id-2" name="detail-tag-id-2" text="编辑推荐" class="book-detail-item" clstag="shangpin|keycount|product|bianjituijianqu_3"><div class="item-mt"><h3>编辑推荐</h3></div><div class="item-mc"><div class="book-detail-content"><p>　　畅销书全新升级，第1版广获好评；资深MySQL专家撰写，全球知名MySQL数据库服务提供商Percona公司CTO作序推荐，国内多位数据库专家联袂推荐<br/>　　基于MySQL 5.6，结合源代码，从存储引擎内核角度对InnoDB的整体架构、核心实现和工作机制进行深入剖析</p><p><br/></p><p><strong><span style="font-size: 12px;color: rgb(102, 102, 102)">更多精彩，点击进入品牌店查阅&gt;&gt;</span></strong></p><p><a href="http://mall.jd.com/view_page-27025526.html" target="_blank"><img class="" src="//img30.360buyimg.com/vc/jfs/t2026/38/1749253666/89958/8f2dcc57/56724e61N00307fa1.jpg" style="" data-lazyload="done" title="750-110.jpg"/></a></p></div></div></div><div id="detail-tag-id-3" name="detail-tag-id-3" text="内容简介" class="book-detail-item" clstag="shangpin|keycount|product|neirongjianjiequ_3"><div class="item-mt"><h3>内容简介</h3></div><div class="item-mc"><div class="book-detail-content">　　《MySQL技术内幕：InnoDB存储引擎》由国内资深MySQL专家亲自执笔，国内外多位数据库专家联袂推荐。作为国内一本关于InnoDB的专著，本书的第1版广受好评，第2版不仅针对全新的MySQL 5.6对相关内容进行了全面的补充，还根据广大读者的反馈意见对第1版中存在的不足进行了完善，全书大约重写了50％的内容。本书从源代码的角度深度解析了InnoDB的体系结构、实现原理、工作机制，并给出了大量实践，能帮助你系统而深入地掌握InnoDB，更重要的是，它能为你设计管理高性能、高可用的数据库系统提供专业的指导。<br/>　　《MySQL技术内幕：InnoDB存储引擎》一共10章，首先宏观地介绍了MySQL的体系结构和各种常见的存储引擎以及它们之间的比较；接着以InnoDB的内部实现为切入点，逐一详细讲解了InnoDB存储引擎内部的各个功能模块的实现原理，包括InnoDB存储引擎的体系结构、内存中的数据结构、基于InnoDB存储引擎的表和页的物理存储、索引与算法、文件、锁、事务、备份与恢复，以及InnoDB的性能调优等重要的知识；最后对InnoDB存储引擎源代码的编译和调试做了介绍，对大家阅读和理解InnoDB的源代码有重要的指导意义。<br/>　　本书适合所有希望构建和管理高性能、高可用性的MySQL数据库系统的开发者和DBA阅读。<br/></div></div></div><div id="detail-tag-id-4" name="detail-tag-id-4" text="作者简介" class="book-detail-item" clstag="shangpin|keycount|product|zuozhejianjiequ_3"><div class="item-mt"><h3>作者简介</h3></div><div class="item-mc"><div class="book-detail-content"><p>　　姜承尧（David Jiang），资深MySQL数据库专家，擅长于数据库的故障诊断、性能调优、容灾处理、高可用和高扩展研究，同时一直致力于MySQL数据库底层实现原理的研究和探索。此外，对高性能数据库和数据仓库也有深刻而独到的理解。曾为MySQL编写了许多开源工具和性能扩展补丁，如广受好评的InnoDB引擎二级缓存项目。现任网易杭州研究院技术经理一职，负责MySQL数据库的内核开发，参与设计与开发MySQL数据库在网易云环境中的应用。曾担任久游网数据库工程部经理，曾领导并参与了多个大型核心数据库的设计、实施、管理和维护，实战经验非常丰富。活跃于开源数据库以及开源软件领域，是著名开源社区ChinaUnix MySQL版块的版主，热衷于与网友分享自己的心得和体会，深受社区欢迎。<br/>　　除本书外，他还撰写了《MySQL技术内幕：SQL编程》，是本书的姊妹篇，颇受好评。</p></div></div></div><div id="detail-tag-id-6" name="detail-tag-id-6" text="目录" class="book-detail-item" clstag="shangpin|keycount|product|muluqu_3"><div class="item-mt"><h3>目录</h3></div><div class="item-mc"><div class="book-detail-content">推荐序<br/>前言<br/>第1章　MySQL体系结构和存储引擎<br/>1.1　定义数据库和实例<br/>1.2　MySQL体系结构<br/>1.3　MySQL存储引擎<br/>1.3.1　InnoDB存储引擎<br/>1.3.2　MyISAM存储引擎<br/>1.3.3　NDB存储引擎<br/>1.3.4　Memory存储引擎<br/>1.3.5　Archive存储引擎<br/>1.3.6　Federated存储引擎<br/>1.3.7　Maria存储引擎<br/>1.3.8　其他存储引擎<br/>1.4　各存储引擎之间的比较<br/>1.5　连接MySQL<br/>1.5.1　TCP/IP<br/>1.5.2　命名管道和共享内存<br/>1.5.3　UNIX域套接字<br/>1.6　小结<br/>第2章　InnoDB存储引擎<br/>2.1　InnoDB存储引擎概述<br/>2.2　InnoDB存储引擎的版本<br/>2.3　InnoDB体系架构<br/>2.3.1　后台线程<br/>2.3.2　内存<br/>2.4　Checkpoint技术<br/>2.5　Master Thread工作方式<br/>2.5.1　InnoDB 1.0.x版本之前的Master Thread<br/>2.5.2　InnoDB1.2.x版本之前的Master Thread<br/>2.5.3　InnoDB1.2.x版本的Master Thread<br/>2.6　InnoDB关键特性<br/>2.6.1　插入缓冲<br/>2.6.2　两次写<br/>2.6.3　自适应哈希索引<br/>2.6.4　异步IO<br/>2.6.5　刷新邻接页<br/>2.7　启动、关闭与恢复<br/>2.8　小结<br/>第3章　文件<br/>3.1　参数文件<br/>3.1.1　什么是参数<br/>3.1.2　参数类型<br/>3.2　日志文件<br/>3.2.1　错误日志<br/>3.2.2　慢查询日志<br/>3.2.3　查询日志<br/>3.2.4　二进制日志<br/>3.3　套接字文件<br/>3.4　pid文件<br/>3.5　表结构定义文件<br/>3.6　InnoDB存储引擎文件<br/>3.6.1　表空间文件<br/>3.6.2　重做日志文件<br/>3.7　小结<br/>第4章　表<br/>4.1　索引组织表<br/>4.2　InnoDB逻辑存储结构<br/>4.2.1　表空间<br/>4.2.2　段<br/>4.2.3　区<br/>4.2.4　页<br/>4.2.5　行<br/>4.3　InnoDB行记录格式<br/>4.3.1　Compact行记录格式<br/>4.3.2　Redundant行记录格式<br/>4.3.3　行溢出数据<br/>4.3.4　Compressed和Dynamic行记录格式<br/>4.3.5　CHAR的行结构存储<br/>4.4　InnoDB数据页结构<br/>4.4.1　File Header<br/>4.4.2　Page Header<br/>4.4.3　Infimum和Supremum Records<br/>4.4.4　User Records和Free Space<br/>4.4.5　Page Directory<br/>4.4.6　File Trailer<br/>4.4.7　InnoDB数据页结构示例分析<br/>4.5　Named File Formats机制<br/>4.6　约束<br/>4.6.1　数据完整性<br/>4.6.2　约束的创建和查找<br/>4.6.3　约束和索引的区别<br/>4.6.4　对错误数据的约束<br/>4.6.5　ENUM和SET约束<br/>4.6.6　触发器与约束<br/>4.6.7　外键约束<br/>4.7　视图<br/>4.7.1　视图的作用<br/>4.7.2　物化视图<br/>4.8　分区表<br/>4.8.1　分区概述<br/>4.8.2　分区类型<br/>4.8.3　子分区<br/>4.8.4　分区中的NULL值<br/>4.8.5　分区和性能<br/>4.8.6　在表和分区间交换数据<br/>4.9　小结<br/>第5章　索引与算法<br/>5.1　InnoDB存储引擎索引概述<br/>5.2　数据结构与算法<br/>5.2.1　二分查找法<br/>5.2.2　二叉查找树和平衡二叉树<br/>5.3　B+树<br/>5.3.1　B+树的插入操作<br/>5.3.2　B+树的删除操作<br/>5.4　B+树索引<br/>5.4.1　聚集索引<br/>5.4.2　辅助索引<br/>5.4.3　B+树索引的分裂<br/>5.4.4　B+树索引的管理<br/>5.5　Cardinality值<br/>5.5.1　什么是Cardinality<br/>5.5.2　InnoDB存储引擎的Cardinality统计<br/>5.6　B+树索引的使用<br/>5.6.1　不同应用中B+树索引的使用<br/>5.6.2　联合索引<br/>5.6.3　覆盖索引<br/>5.6.4　优化器选择不使用索引的情况<br/>5.6.5　索引提示<br/>5.6.6　Multi-Range Read优化<br/>5.6.7　Index Condition Pushdown（ICP）优化<br/>5.7　哈希算法<br/>5.7.1　哈希表<br/>5.7.2　InnoDB存储引擎中的哈希算法<br/>5.7.3　自适应哈希索引<br/>5.8　全文检索<br/>5.8.1　概述<br/>5.8.2　倒排索引<br/>5.8.3　InnoDB全文检索<br/>5.8.4　全文检索<br/>5.9　小结<br/>第6章　锁<br/>6.1　什么是锁<br/>6.2　lock与latch<br/>6.3　InnoDB存储引擎中的锁<br/>6.3.1　锁的类型<br/>6.3.2　一致性非锁定读<br/>6.3.3　一致性锁定读<br/>6.3.4　自增长与锁<br/>6.3.5　外键和锁<br/>6.4　锁的算法<br/>6.4.1　行锁的3种算法<br/>6.4.2　解决Phantom Problem<br/>6.5　锁问题<br/>6.5.1　脏读<br/>6.5.2　不可重复读<br/>6.5.3　丢失更新<br/>6.6　阻塞<br/>6.7　死锁<br/>6.7.1　死锁的概念<br/>6.7.2　死锁概率<br/>6.7.3　死锁的示例<br/>6.8　锁升级<br/>6.9　小结<br/>第7章　事务<br/>7.1　认识事务<br/>7.1.1　概述<br/>7.1.2　分类<br/>7.2　事务的实现<br/>7.2.1　redo<br/>7.2.2　undo<br/>7.2.3　purge<br/>7.2.4　group commit<br/>7.3　事务控制语句<br/>7.4　隐式提交的SQL语句<br/>7.5　对于事务操作的统计<br/>7.6　事务的隔离级别<br/>7.7　分布式事务<br/>7.7.1　MySQL数据库分布式事务<br/>7.7.2　内部XA事务<br/>7.8　不好的事务习惯<br/>7.8.1　在循环中提交<br/>7.8.2　使用自动提交<br/>7.8.3　使用自动回滚<br/>7.9　长事务<br/>7.10　小结<br/>第8章　备份与恢复<br/>8.1　备份与恢复概述<br/>8.2　冷备<br/>8.3　逻辑备份<br/>8.3.1　mysqldump<br/>8.3.2　SELECT...INTO OUTFILE<br/>8.3.3　逻辑备份的恢复<br/>8.3.4　LOAD DATA INFILE<br/>8.3.5　mysqlimport<br/>8.4　二进制日志备份与恢复<br/>8.5　热备<br/>8.5.1　ibbackup<br/>8.5.2　XtraBackup<br/>8.5.3　XtraBackup实现增量备份<br/>8.6　快照备份<br/>8.7　复制<br/>8.7.1　复制的工作原理<br/>8.7.2　快照+复制的备份架构<br/>8.8　小结<br/>第9章　性能调优<br/>9.1　选择合适的CPU<br/>9.2　内存的重要性<br/>9.3　硬盘对数据库性能的影响<br/>9.3.1　传统机械硬盘<br/>9.3.2　固态硬盘<br/>9.4　合理地设置RAID<br/>9.4.1　RAID类型<br/>9.4.2　RAID Write Back功能<br/>9.4.3　RAID配置工具<br/>9.5　操作系统的选择<br/>9.6　不同的文件系统对数据库性能的影响<br/>9.7　选择合适的基准测试工具<br/>9.7.1　sysbench<br/>9.7.2　mysql-tpcc<br/>9.8　小结<br/>第10章　InnoDB存储引擎源代码的编译和调试<br/>10.1　获取InnoDB存储引擎源代码<br/>10.2　InnoDB源代码结构<br/>10.3　MySQL 5.1版本编译和调试InnoDB源代码<br/>10.3.1　Windows下的调试<br/>10.3.2　Linux下的调试<br/>10.4　cmake方式编译和调试InnoDB存储引擎<br/>10.5　小结</div></div><div class="more"><a data-open="1" href="http://#detail-tag-id-6" clstag="shangpin|keycount|product|muluquanbu_3">收起全部↑</a></div></div><div id="detail-tag-id-8" name="detail-tag-id-8" text="前言/序言" class="book-detail-item" clstag="shangpin|keycount|product|qianyanqu_3"><div class="item-mt"><h3>前言/序言</h3></div><div class="item-mc"><div style="height: 314px; overflow: hidden;" class="book-detail-content">　　为什么要写这本书<br/>　　过去这些年我一直在和各种不同的数据库打交道，见证了MySQL从一个小型的关系型数据库发展为各大企业的核心数据库系统的过程，并且参与了一些大大小小的项目的开发工作，成功地帮助开发人员构建了可靠的、健壮的应用程序。在这个过程中积累了一些经验，正是这些不断累积的经验赋予了我灵感，于是有了这本书。这本书实际上反映了这些年来我做了哪些事情，其中汇集了很多同行每天可能都会遇到的一些问题，并给出了解决方案。<br/>　　MySQL数据库独有的插件式存储引擎架构使其和其他任何数据库都不同。不同的存储引擎有着完全不同的功能，而InnoDB存储引擎的存在使得MySQL跃入了企业级数据库领域。本书完整地讲解了InnoDB存储引擎中最重要的一些内容，即InnoDB的体系结构和工作原理，并结合InnoDB的源代码讲解了它的内部实现机制。<br/>　　本书不仅讲述了InnoDB存储引擎的诸多功能和特性，还阐述了如何正确地使用这些功能和特性，更重要的是，还尝试了教我们如何Think Different。Think Different是20世纪90年代苹果公司在其旷日持久的宣传活动中提出的一个口号，借此来重振公司的品牌，更重要的是，这个口号改变了人们对技术在日常生活中的作用的看法。需要注意的是，苹果的口号不是Think Differently，是Think Different，Different在这里做名词，意味该思考些什么。<br/>　　很多DBA和开发人员都相信某些“神话”，然而这些“神话”往往都是错误的。无论计算机技术发展的速度变得多快，数据库的使用变得多么简单，任何时候Why都比What重要。只有真正理解了内部实现原理、体系结构，才能更好地去使用。这正是人类正确思考问题的原则。因此，对于当前出现的技术，尽管学习其应用很重要，但更重要的是，应当正确地理解和使用这些技术。<br/>　　关于本书，我的头脑里有很多个目标，但最重要的是想告诉大家如下几个简单的观点：<br/>　　·不要相信任何的“神话”，学会自己思考；<br/>　　·不要墨守成规，大部分人都知道的事情可能是错误的；<br/>　　·不要相信网上的传言，去测试，根据自己的实践做出决定；<br/>　　·花时间充分地思考，敢于提出质疑。<br/>　　当前有关MySQL的书籍大部分都集中在教读者如何使用MySQL，例如SQL语句的使用、复制的搭建的、数据的切分等。没错，这对快速掌握和使用MySQL数据库非常有好处，但是真正的数据库工作者需要了解的不仅仅是应用，更多的是内部的具体实现。<br/>　　MySQL数据库独有的插件式存储引擎使得想要在一本书内完整地讲解各个存储引擎变得十分困难，有的书可能偏重对MyISAM的介绍，有的可能偏重对InnoDB存储引擎的介绍。对于初级的DBA来说，这可能会使他们的理解变得更困难。对于大多数MySQL DBA和开发人员来说，他们往往更希望了解作为MySQL企业级数据库应用的第一存储引擎的InnoDB，我想在本书中，他们完全可以找到他们希望了解的内容。<br/>　　再强调一遍，任何时候Why都比What重要，本书从源代码的角度对InnoDB的存储引擎的整个体系架构的各个组成部分进行了系统的分析和讲解，剖析了InnoDB存储引擎的核心实现和工作机制，相信这在其他书中是很难找到的。<br/>　　第1版与第2版的区别<br/>　　本书是第2版，在写作中吸收了读者对上一版内容的许多意见和建议，同时对于最新MySQL 5.6中许多关于InnoDB存储引擎的部分进行了详细的解析与介绍。希望通过这些改进，给读者一个从应用到设计再到实现的完整理解，弥补上一版中深度有余，内容层次不够丰富、分析手法单一等诸多不足。<br/>　　较第1版而言，第2版的改动非常大，基本上重写了50%的内容。其主要体现在以下几个方面，希望读者能够在阅读中体会到。<br/>　　·本书增加了对最新MySQL 5.6中的InnoDB存储引擎特性的介绍。MySQL 5.6版本是有史以来最大的一次更新，InnoDB存储引擎更是添加了许多功能，如多线程清理线程、全文索引、在线索引添加、独立回滚段、非递归死锁检测、新的刷新算法、新的元数据表等。读者通过本书可以知道如何使用这些特性、新特性存在的局限性，并明白新功能与老版本InnoDB存储引擎之间实现的区别，从而在实际应用中充分利用这些特性。<br/>　　·根据读者的要求对于InnoDB存储引擎的redo日志和undo日志进行了详细的分析。读者应该能更好地理解InnoDB存储引擎事务的实现。在undo日志分析中，通过InnoSQL自带的元数据表，用户终于可对undo日志进行统计和分析，极大提高了DBA对于InnoDB存储引擎内部的认知。<br/>　　·对第6章进行大幅度的重写，读者可以更好地理解InnoDB存储引擎特有的next-key locking算法，并且通过分析锁的实现来了解死锁可能产生的情况，以及InnoDB存储引擎内部是如何来避免死锁问题的产生的。<br/>　　·根据读者的反馈，对InnoDB存储引擎的insert buffer模块实现进行了更为详细的介绍，读者可以了解其使用方法以及其内部的实现原理。此外还增加了对insert buffer的升级版本功能——change buffer的介绍。<br/>　　读者对象<br/>　　本书不是一本面向应用的数据库类书籍，也不是一本参考手册，更不会教你如何在MySQL中使用SQL语句。本书面向那些使用MySQL InnoDB存储引擎作为数据库后端开发应用程序的开发者和有一定经验的MySQL DBA。书中的大部分例子都是用SQL语句来展示关键特性的，如果想通过本书来了解如何启动MySQL、如何配置Replication环境，可能并不能如愿。不过，在本书中，你将知道InnoDB存储引擎是如何工作的，它的关键特性的功能和作用是什么，以及如何正确配置和使用这些特性。<br/>　　如果你想更好地使用InnoDB存储引擎，如果你想让你的数据库应用获得更好的性能，就请阅读本书。从某种程度上讲，技术经理或总监也要非常了解数据库，要知道数据库对于企业的重要性。如果技术经理或总监想安排员工参加MySQL数据库技术方面的培训，完全可以利用本书来“充电”，相信你一定不会失望的。<br/>　　要想更好地学习本书的内容，要求具备以下条件：<br/>　　·掌握SQL。<br/>　　·掌握基本的MySQL操作。<br/>　　·接触过一些高级语言，如C、C++、Python或Java。<br/>　　·对一些基本算法有所了解，因为本书会分析InnoDB存储引擎的部分源代码，如果你能看懂这些算法，这会对你的理解非常有帮助。<br/>　　如何阅读本书<br/>　　本书一共有10章，每一章都像一本“迷你书”，可以单独成册，也就说你完全可以从书中任何一章开始阅读。例如，要了解第10章中的InnoDB源代码编译和调试的知识，就不必先去阅读第3章有关文件的知识。当然，如果你不太确定自己是否已经对本书所涉及的内容完全掌握了，建议你系统性地阅读本书。<br/>　　本书不是一本入门书籍，不会一步步引导你去如何操作。倘若你尚不了解InnoDB存储引擎，本书对你来说可能就显得沉重一些，建议你先查阅官方的API文档，大致掌握InnoDB的基础知识，然后再来学习本书，相信你会领略到不同的风景。<br/>　　为了便于大家阅读，本书在提供源代码下载的同时也将源代码附在了书中，因此占去了一些篇幅，还请大家理解。<br/>　　致谢<br/>　　在编写本书的过程中，我得到了很多朋友的热心帮助。首先要感谢Pecona公司的CEO Peter Zaitsev和CTO Vadim Tkachenko，通过和他们的不断交流，使我对InnoDB存储引擎有了更进一步的了解，同时知道了怎样才能正确地将InnoDB存储引擎的补丁应用到生产环境。<br/>　　其次，要感谢网易公司的各位同事们，能在才华横溢、充满创意的团队中工作我感到非常荣幸和兴奋。也因为在这个开放的工作环境中，我可以不断进行研究和创新。<br/>　　此外，我还要感谢我的母亲，写本书不是一件容易的事，特别是这本书还想传达一些思想，在这个过程中我遇到了很多的困难，感谢她在这个过程中给予我的支持和鼓励。<br/>　　最后，一份特别的感谢要送给本书的策划编辑杨福川和姜影，他们使得本书变得生动和更具有灵魂。此外还要感谢出版社的其他默默工作的同事们。<br/>　　姜承尧</div></div><div class="more"><a data-open="0" href="http://#detail-tag-id-8" clstag="shangpin|keycount|product|qianyanquanbu_3">查看全部↓</a></div></div><p><br/></p>
         * goods_price : 100.00
         * type_id : 61
         * parent_id : 60
         * limit_buy_num : 0
         * auto_release : y
         * is_down_line : n
         * img_n : http://rtxos.taoweikeji.com/Public/Uploads/o_1a94u9g85u13o66mlje6jf3qd.jpg
         * surplus : 100
         */

        private List<ListEntity> list;

        public void setPage(String page) {
            this.page = page;
        }

        public void setList(List<ListEntity> list) {
            this.list = list;
        }

        public String getPage() {
            return page;
        }

        public List<ListEntity> getList() {
            return list;
        }

        public static class ListEntity {
            private String goods_id;
            private String expect;
            private String goods_status;
            private String open_time;
            private String id;
            private String goods_name;
            private String goods_expect;
            private String goods_info;
            private String goods_price;
            private String type_id;
            private String parent_id;
            private String limit_buy_num;
            private String auto_release;
            private String is_down_line;
            private String img_n;
            private int surplus;
            private List<String> cover_img;

            public void setGoods_id(String goods_id) {
                this.goods_id = goods_id;
            }

            public void setExpect(String expect) {
                this.expect = expect;
            }

            public void setGoods_status(String goods_status) {
                this.goods_status = goods_status;
            }

            public void setOpen_time(String open_time) {
                this.open_time = open_time;
            }

            public void setId(String id) {
                this.id = id;
            }

            public void setGoods_name(String goods_name) {
                this.goods_name = goods_name;
            }

            public void setGoods_expect(String goods_expect) {
                this.goods_expect = goods_expect;
            }

            public void setGoods_info(String goods_info) {
                this.goods_info = goods_info;
            }

            public void setGoods_price(String goods_price) {
                this.goods_price = goods_price;
            }

            public void setType_id(String type_id) {
                this.type_id = type_id;
            }

            public void setParent_id(String parent_id) {
                this.parent_id = parent_id;
            }

            public void setLimit_buy_num(String limit_buy_num) {
                this.limit_buy_num = limit_buy_num;
            }

            public void setAuto_release(String auto_release) {
                this.auto_release = auto_release;
            }

            public void setIs_down_line(String is_down_line) {
                this.is_down_line = is_down_line;
            }

            public void setImg_n(String img_n) {
                this.img_n = img_n;
            }

            public void setSurplus(int surplus) {
                this.surplus = surplus;
            }

            public void setCover_img(List<String> cover_img) {
                this.cover_img = cover_img;
            }

            public String getGoods_id() {
                return goods_id;
            }

            public String getExpect() {
                return expect;
            }

            public String getGoods_status() {
                return goods_status;
            }

            public String getOpen_time() {
                return open_time;
            }

            public String getId() {
                return id;
            }

            public String getGoods_name() {
                return goods_name;
            }

            public String getGoods_expect() {
                return goods_expect;
            }

            public String getGoods_info() {
                return goods_info;
            }

            public String getGoods_price() {
                return goods_price;
            }

            public String getType_id() {
                return type_id;
            }

            public String getParent_id() {
                return parent_id;
            }

            public String getLimit_buy_num() {
                return limit_buy_num;
            }

            public String getAuto_release() {
                return auto_release;
            }

            public String getIs_down_line() {
                return is_down_line;
            }

            public String getImg_n() {
                return img_n;
            }

            public int getSurplus() {
                return surplus;
            }

            public List<String> getCover_img() {
                return cover_img;
            }
        }
    }
}
